【问题标题】:Query MongoDB for documents with non-empty intersection of arrays在 MongoDB 中查询具有非空数组交集的文档
【发布时间】:2014-01-16 21:20:00
【问题描述】:

所以 - 我有一个 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/

提供的语法

我尝试上述方法只是为了看看是否可以让 anything 与 $where 一起工作,但是当我尝试将服务器端 JS 添加到组合中时会出现更多问题。我看了看 http://docs.mongodb.org/manual/tutorial/store-javascript-function-on-server/

并将以下内容添加到我的数据库中的 system.js 集合中:

{
    "_id": "isMatch",
    "value": "function(){return false}"
}

并修改了上面的例子

collection.find( {$where: 'isMatch()' } ).toArray(function(err, matches){...

认为 isMatch 现在会在 mongo 的技巧包中当它 eval 是字符串(我假设它必须是 eval'ing 字符串),并且字符串语法是上述游戏中最好的选择。可悲的是,这导致控制台日志为空 - 另一种错误,我希望再次出现一个空数组。

谁能帮我实现我上面描述的查询?我怀疑如果你们好心的人可以帮助我理解 1.如何使用函数语法而不是 $where 的字符串语法,以及 2.如何在 system.js 中正确声明 JS 函数与 $where 一起使用。提前致谢!

【问题讨论】:

  • 您可能想要编辑您的问题标题以反映您想要完成的任务,而不是您想要完成的 方式(因为答案完全是不同的)。它会让其他人更容易在这里找到相关的问题和答案。

标签: node.js mongodb heroku


【解决方案1】:

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

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

【讨论】:

  • 太棒了!比我试图做的巫术简单几个数量级,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多