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

仅供参考 – 我知道如何使用MongoDB驱动程序,并知道这不是一个如何使用它的Web应用程序,但这不是一个Web应用程序。 我的目标是在NodeJS中模拟MongoDB shell

我正在写一个数据库graphics用户界面,并希望执行一个原始的MongoDB查询,例如db.tableName.find({ col: 'value' }) 。 我可以使用本地MongoDB驱动程序来实现吗? 我使用的是最新版本的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的目标,您需要parsing用户键入的命令并执行相应的命令,同时牢记:

  1. Mongo Shell使用的SpiderMonkey与V8和libuv的节点之间的区别
  2. BSON和JSON的区别
  3. Mongo Shell同步工作,Node Driverasynchronous工作

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

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

在Node中, .find()方法不返回值,但是它需要callback或者返回一个promise。 这将是棘手的。 db.test.find()[0].x; 案例可能相对容易处理(如果你很好地理解了承诺),但这将是更困难的:

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

并记住你需要处理任意嵌套的级别。

Mongo协议

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

但是你实际上并没有把JavaScript发送到Mongo服务器,所以你不能发送像db.collection.find()这样的东西。 而是发送一个二进制OP_QUERY结构,其集合名称被编码为一个cstring,一个查询编码为BSON加上一堆二进制标志。 看到:

BSON本身是一个二进制格式,其中一些低级值定义为字节:

底线是你不会发送到Mongo服务器的任何东西,类似于你在Mongo shell中input的内容。 Mongo shell使用SpiderMonkeyparsing器parsing您input的内容,并将二进制请求发送到实际的Mongo服务器。 Mongo shell使用JavaScript,但是你不能用JavaScript与Mongo服务器通信。

甚至JSON查询对象也不会以JSON的forms发送到Mongo。 例如,当你正在search一个hello属性等于“world”的文档时,你可以在JavaScript中使用{hello: 'world'} ,或者在JSON中使用{"hello": "world"} ,但这是发送到Mongo服务器 – 由Mongo shell或任何其他Mongo客户端:

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

为什么它是如此不同

为了理解为什么Node中使用的语法与Mongo shell差别很大,请参阅此答案:

  • 为什么nodejs-mongodb中间件与mongo shell有不同的语法?