MongoDB $可以让运算符像这样奇怪吗?

时间:2012-05-05 11:47:57

标签: mongodb find where mongodb-query

我正在测试MongoDB,这是一个让我感到惊讶的例子:

> function compare(a,b) { return (a==b); }

然后列出我的收藏:

> db.myCol.find()
{ "_id:" : ObjectId("..."), "name" : "mongo" }
{ "_id:" : ObjectId("..."), "x" : 3 }
{ "_id:" : ObjectId("..."), "name" : "mongo", "notName" : "wow" }

和 - 完全确定:

> compare('mongo','mongo')
true

和奇怪的部分:

> db.myCol.find( { $where : "compare(this.name,'mongo')" } )
{ "_id:" : ObjectId("..."), "x" : 3 }
> db.myCol.find( { $where : "this.name=='mongo'" } )
{ "_id:" : ObjectId("..."), "name" : "mongo" }
{ "_id:" : ObjectId("..."), "name" : "mongo", "notName" : "wow" }

我希望查询的设置完全相反。

2 个答案:

答案 0 :(得分:2)

您获得奇怪结果的原因是因为您实际上没有运行您定义的比较功能。它是在本地定义的,但您是在mongodb实例上远程执行命令。真正发生的是使用内置比较:

> compare
function (l, r) {
    return l == r ? 0 : l < r ? -1 : 1;
}

> compare('mongo', 'mongo')
0

以下是您的说法:

> function compare1(a,b) {return a==b}

> db.myCol.find( { $where : "compare1(this.name,'mongo')" } )
error: {
    "$err" : "error on invocation of $where function:\nJS Error: ReferenceError: compare1 is not defined nofile_a:0",
    "code" : 10071
}

Server-side Code Execution上有一个文档页面,介绍了如何在服务器上存储功能。但是,它还解释了在可能的情况下不应使用服务器端功能。

答案 1 :(得分:0)

使用$ where运算符,简单忘记服务端代码执行,因为这很慢,不会使用索引,并会在执行时锁定服务器进程。