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

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

我正在写一个数据库graphics用户界面,并希望执行一个原始的MongoDB查询,例如db.tableName.find({ col: 'value' }) 。 我可以使用本地MongoDB驱动程序来实现吗? 我使用的是最新版本的v2.2。

如果没有,我怎么能在NodeJS中实现这个?

  • 通过Node.js驱动运行任意的MongoDB脚本
  • connect-mongo创build的条目不会过期
  • 问题与Mongoose model.savecallback
  • 按其子文档分割文档
  • Node.js REST API从MongoDB中获取数据
  • logging温斯顿 - 蒙戈德,特快 - 温斯顿和温斯顿
  • Expressjs使用对象标题作为dynamicurl
  • Mongoose不会在Mocha中正确删除数据库和closures连接
  • 注意:问题已经改变 – 请参阅下面的更新。

    原始答案:

    是。

    代替:

     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有不同的语法?