【发布时间】: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 一起使用。提前致谢!
【问题讨论】:
-
您可能想要编辑您的问题标题以反映您想要完成的任务,而不是您想要完成的 方式(因为答案完全是不同的)。它会让其他人更容易在这里找到相关的问题和答案。