所以-我正在开发一个Heroku+Node+Express+MongoDB应用程序,我一整天都在尝试摸索如何获得我想要的Mongo查询。在Mongo集合中,每个文档都有一个名为“fruits”的属性,它是一个包含字符串的数组,例如:
fruits : ['apple', 'orange', 'lemon']
水果的大小和内容是任意的。我想查询数据库中所有具有至少一个与我提供的另一个数组相同元素的水果数组文档。我如何实现这一点?
目前我尝试过的方法主要集中在$where查询和一些服务器端JS上。如果我执行类似于下面的操作:
mongo.Db.connect(mongoUri, function(err, db) {
db.collection('Users', function(er, collection) {
collection.find( {$where: 'false' } ).toArray(function(err, matches){
console.log(matches)
...
});
});
});
我得到了一个空数组 - 很好!如果我将false更改为true,我得到整个数据库 - 也很好!但是,像下面这样的内容就不太好了:
collection.find( {$where: function(){return false} } ).toArray(function(err, matches){...
我再次获取整个数据库!我认为这会像上面给出的第一个例子一样明显地返回相同的空数组,符合在http://docs.mongodb.org/manual/reference/operator/query/where/中给出的语法。
我尝试上面的操作只是想看看是否可以使用$where得到任何结果,但当我尝试将服务器端JS添加到其中时,出现了更多问题。我查看了http://docs.mongodb.org/manual/tutorial/store-javascript-function-on-server/,并将以下内容添加到我的DB的system.js集合中:
{
"_id": "isMatch",
"value": "function(){return false}"
}
并使用以下代码修改了上面的示例:
collection.find( {$where: 'isMatch()' } ).toArray(function(err, matches){...
认为在mongo评估字符串时,isMatch现在应该是mongo的技巧之一(我认为它必须是eval'ing字符串),而且从上面描述的试验中,字符串语法是最好的选择。可悲的是,这会导致控制台记录null - 另一种错误的形式,我再次期望得到一个空数组。
有谁可以帮助我实现上述查询?如果您能够帮助我理解1.如何使用函数语法而不是字符串语法来进行$where操作,以及2.如何正确声明JS函数以在$where中使用,则我认为我可以自己找出细节。提前感谢您的帮助!