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中完成。事实上,我今天提交了一个文档补丁请求,因为正如您所证明的,它是误导性的。