Mongodb Mongo在隐式$where子句方面的行为不符合文档
以下代码起作用:Mongodb Mongo在隐式$where子句方面的行为不符合文档,mongodb,mongodb-query,Mongodb,Mongodb Query,以下代码起作用: collection.find({ $where: "this.primary_photo === 'bar'" }).toArray( (err, documents) => { if (err) throw err console.log('documents:::', documents) }) 但以下情况并非如此: collection.find("this.primary_photo === 'bar'").toArray( (err, docume
collection.find({ $where: "this.primary_photo === 'bar'" }).toArray( (err, documents) => {
if (err) throw err
console.log('documents:::', documents)
})
但以下情况并非如此:
collection.find("this.primary_photo === 'bar'").toArray( (err, documents) => {
if (err) throw err
console.log('documents:::', documents)
})
根据:
如果查询仅包含$where运算符,则可以传入
只有JavaScript表达式或JavaScript函数,如
以下例子:
db.myCollection.find(“this.credits==this.debits | | this.credits>
这是“借记”)
db.myCollection.find(函数(){return(this.credits==this.debits
||this.credits>this.debitis)})
为什么我的实现失败了
当我只传递字符串时,出现以下错误:
MongoError: query selector must be an object
at Function.MongoError.create (/home/pierre/Desktop/spysmiles.com/node_modules/mongodb-core/lib/error.js:31:11)
at Collection.find (/home/pierre/Desktop/spysmiles.com/node_modules/mongodb/lib/collection.js:313:22)
at MongoClient.connect (/home/pierre/Desktop/spysmiles.com/tools/sst/commands/image/delete.js:28:16)
at connectCallback (/home/pierre/Desktop/spysmiles.com/node_modules/mongodb/lib/mongo_client.js:428:5)
at /home/pierre/Desktop/spysmiles.com/node_modules/mongodb/lib/mongo_client.js:347:11
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
我正在使用Node.js驱动程序,并在节点脚本中运行此查询。感谢Neil Lunn的评论,我能够确定我查看的文档实际上是针对mongo shell的。之所以让人困惑,是因为
$where
操作符接受javascript(并在mongo服务器上执行),我相信它会在文档中显示出来,因为它演示了node.js驱动程序。原来Mongo天生就懂javascript
我还发现以下问题和答案很有帮助:
简言之,您可以使用node.js驱动程序使用
$where
操作符,但必须将其作为对象显式传递({$where:'function(){}}}
),并且函数必须作为字符串传递,否则mongo只会返回所有文档(请参阅上面的链接问题) 为什么要使用$where
?这是本机运算符的简单查询{“primary_photo”:“bar”}
。这里的文档实际上是误导性的,因为您关注的特定代码块示例仅在“MongoShell”中有效。事实上,除了JavaScript之外,任何其他语言都不支持在.find()
中直接使用缩短的函数()。几乎在每个驱动程序中,支持的表单本质上都是“一个JavaScript函数或表达式,返回表示为字符串的布尔值”,并与$where
键成对出现。简言之,这就是支持的方式。你曲解了文件。但是文档“应该”更清楚地说明这一点。大多数运算符语法是适用于所有语言实现的通用翻译。但是在这种情况下,特定的.find(“true”)
(作为任何表达式的本质)仅适用于shell,它将字符串的输入视为隐含的$where
。驱动程序本身并不遵守这一规则,在JavaScript之外,在大多数语言中,这是不可能的。无论如何,在您认为需要表达式的90%情况下,通常可以使用运算符应用。剩下的90%可以用更快的.aggregate()
和$redact
应用。还引用了“…尽可能地模拟官方mongodb API。它包装mongodb native”,这意味着它只真正做底层驱动程序所做的事情,然后只做“.尽可能地…”因为对于可以应用的内容有一些限制。所以“按设计工作”。是的,它仍然适用。我还从上面的基本nodejs驱动程序链接到.find()
方法文档。因此,问题本质上是,您不能简单地在.find()
的参数中提供一个表达式作为“字符串”,而这只能在mongo shell中完成。事实上,我今天提交了一个文档补丁请求,因为正如您所证明的,它是误导性的。