我可以在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用户键入的命令并执行相应的命令,同时牢记:
- Mongo Shell使用的SpiderMonkey与V8和libuv的节点之间的区别
- BSON和JSON的区别
- 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有不同的语法?
- NodeJS MongoDB传递参数在聚合pipe道中
- 在AngularJS,NodeJS,MongoDB,Mongoose和ExpressJS中使用单一表单发布到多个集合
- Mongoose setDefaultsOnInsert和2dsphere索引不起作用
- 用mongoose进行build筑投票的“正确方法”?
- 在Mongodb Nodejs中分页
- ExpressJS,MongoDB + Socket.IO – 识别单个用户会话
- MongoDB使用node.js中的where来聚合查询
- 为什么在节点上连接mongodb总是出现错误“列表中没有有效的种子服务器”
- 如何将我的meteor应用程序连接到外部的MongoDB?