0

我正在测试 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" }

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

4

2 回答 2

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上有一个文档页面,它解释了如何在服务器上存储函数。但是,它还解释了尽可能不使用服务器端功能。

于 2012-05-05T15:32:31.690 回答
0

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

于 2012-05-05T15:12:06.100 回答