gpt4 book ai didi

node.js - 我可以在 node-mongodb-native 驱动程序中执行原始 MongoDB 查询吗?

转载 作者:可可西里 更新时间:2023-11-01 09:58:47 25 4
gpt4 key购买 nike

仅供引用 - 我知道如何使用 MongoDB 驱动程序并且知道这不是在网络应用程序中使用它的方式,但这不适用于网络应用程序。我的目标是在 NodeJS 中模拟 MongoDB shell

我正在写一个 DB GUI并希望执行原始 MongoDB 查询,例如 db.tableName.find({ col: 'value' })。我可以使用 native MongoDB driver 来实现吗? ?我使用的是 v2.2,这是当前的最新版本。

如果没有,我如何在 NodeJS 中实现这一点?

最佳答案

注意:问题已更改 - 请参阅下面的更新。

原始答案:

是的。

代替:

db.tableName.find({ col: 'value' })

您将其用作:

db.collection('tableName').find({ col: 'value' }, (err, data) => {
if (err) {
// handle error
} else {
// you have data here
}
});

参见:http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#find

更新

在你改变了你的问题并发表了一些评论之后,你想做什么就更清楚了。

为了实现在 Node 中模拟 Mongo shell 的目标,您需要解析用户键入的命令并执行适当的命令,同时牢记:

  1. Mongo shell 使用的 SpiderMonkey 与 Node with V8 和 libuv 的区别
  2. BSON和JSON的区别
  3. Mongo shell 同步工作而 Node 驱动程序异步工作的事实

最后一部分对您来说可能是最难的部分。请记住,在 Mongo shell 中这是完全合法的:

db.test.find()[0].x;

在 Node 中,.find() 方法不返回值,但它接受回调或返回 promise 。这将是棘手的。 db.test.find()[0].x; 用 promises 处理起来可能相对容易(如果你很好地理解了 promises),但这会更难:

db.test.find({x: db.test.find()[0].x});

请记住,您需要处理任意嵌套的级别。

Mongo 协议(protocol)

在阅读了一些评论后,我认为值得注意的是,您实际发送到 Mongo 服务器的内容与您在 Mongo shell 中编写的 JavaScript 无关。 Mongo shell 使用具有大量预定义函数和对象的 SpiderMonkey。

但是您实际上并没有将 JavaScript 发送到 Mongo 服务器,因此您不能发送诸如 db.collection.find() 之类的东西。相反,您发送一个二进制 OP_QUERY 结构,其中集合名称编码为 cstring,查询编码为 BSON 加上一堆二进制标志。见:

BSON 本身是一种二进制格式,具有许多定义为字节的低级值:

最重要的是,您不会向 Mongo 服务器发送任何类似于您在 Mongo shell 中输入的内容。 Mongo shell 使用 SpiderMonkey 解析器解析您键入的内容,并将二进制请求发送到实际的 Mongo 服务器。 Mongo shell 使用 JavaScript 但您不使用 JavaScript 与 Mongo 服务器通信。

例子

即使是 JSON 查询对象也不会作为 JSON 发送到 Mongo。例如,当您搜索 hello 属性等于“world”的文档时,您可以在 JavaScript 中使用 {hello: 'world'}{ “hello”: “world” 在 JSON 中,但这是通过 Mongo shell 或任何其他 Mongo 客户端发送到 Mongo 服务器的内容:

\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00   

为什么如此不同

要了解为什么 Node 中使用的语法与 Mongo shell 如此不同,请参阅以下答案:

关于node.js - 我可以在 node-mongodb-native 驱动程序中执行原始 MongoDB 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41564755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com