MongoDB的$where允许传递一个JavaScript Function作为判断一个文档是否应该被返回到结果,最简单的比如
$where: function (){
return !!this.id;
}
当然真要判断id是否存在别用$where,效率太差,它会把集合内的每个对象或者当前选中的所有对象都跑一边这个函数。
但是由于这个function的实际执行者是MongoDB,也就是说没有NodeJS的上下文,如果需要传递参数进来就会直接成为undefined而报错,即使使用
(function(id){return function(){return !!id;}})(id)
这种闭包也会由于没有上下文只有单独一个函数而无法使用。
最终再三尝试下发现可以用js的Function对象构造一个function再传给MongoDB就可以使用需要的变量了。
在mongoose中可以这么写
var id = 1;
Model.findOne().$where(new Function('return this.id==' + id)).exec(function (err, doc){});
嘛其实我觉得换成eval也差不多一个效果