我正在测试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" }
我希望查询的设置完全相反。
答案 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运算符,简单忘记服务端代码执行,因为这很慢,不会使用索引,并会在执行时锁定服务器进程。