查询MongoDB中具有非空数组交集的文档

4

所以-我正在开发一个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中使用,则我认为我可以自己找出细节。提前感谢您的帮助!


1
你可能想要编辑你的问题标题,以反映你试图实现的目标,而不是你尝试做到这一点的方式(因为答案最终是完全不同的)。这将使其他人更容易在这里找到相关的问题和答案。 - Asya Kamsky
2个回答

5

在shell中尝试使用$where查询没有问题,但是这个查询并不需要使用$where。相反,你可以使用$in查询来定位fruits字段中至少包含一个匹配水果的文档:

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

太棒了!比我之前试图做的那些魔法简单多了,非常感谢。 - Bill Mills

0

我不太清楚2013年的情况,但现在我认为您必须使用$elemMatch$in来定位您的fruits字段,以查找包含至少一个匹配水果的文档:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接