查询MongoDB以查找具有非空数组交叉的文档

时间:2013-12-30 00:59:39

标签: node.js mongodb heroku

所以 - 我正在开发一个Heroku + Node + Express + MongoDB应用程序,我一整天都在玩,试图弄清楚如何获得我想要的mongo查询。在mongo集合中,每个文档都有一个属性'fruits',这是一个字符串数组,如

fruits : ['apple', 'orange', 'lemon']

水果的大小和含量是任意的。我想在数据库中查询所有文档,这些文档的fruits数组至少有一个与我在查询时提供的另一个数组相同的元素。我怎样才能做到这一点?

到目前为止,我尝试过的是$ where 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){...

认为isMatch现在是mongo的一套技巧,当它eval是字符串时(我认为它必须是eval'字符串),并且字符串语法是上述游戏中最好的选择。遗憾的是,这会导致控制台日志为null - 另一种错误,我再次期待一个空数组。

任何人都可以帮我实现上述的查询吗?我怀疑如果你善意的人可以帮助我理解,我可以自己解决这个问题1.如何使用函数语法代替$ where的字符串语法,以及2.如何在system.js中正确声明JS函数与$ where一起使用。提前谢谢!

1 个答案:

答案 0 :(得分:4)

当我在shell中尝试查询时,$where个查询工作正常,但您不需要使用$where进行此查询。相反,您可以使用定位$in字段的fruits来查找包含至少一个匹配水果的文档:

var fruits = ['apple', 'orange', 'lemon'];
db.test.find({fruits: {$in: fruits}});