【问题标题】:NodeJS + Mongo native – check if collection exists before queryNodeJS + Mongo native – 在查询之前检查集合是否存在
【发布时间】:2012-11-03 21:45:17
【问题描述】:

我有一个函数,试图从 MongoDB 的设置集合中获取特定值。设置集合中包含设置值的设置对象的标记是 {'settings':'settings'}。架构是:

collection:setting
|--object
   |--{'settings':'settings'}
   |--{'valueA':'valueA'}
   |--...

问题是当我第一次查询设置对象时,集合“设置”根本不存在。所以,

exports.getInstruments = function (callback) {
db.collection("settings", function(error, settings) {
    settings.find({ "settings" : "settings" }), (function(err, doc) {
           callback(doc.instruments);
    }); 
]);  
}

只是挂起并且不调用回调。如果集合不存在,我应该返回“”或未定义,否则 - doc.instrumens。

【问题讨论】:

    标签: node.js mongodb collections


    【解决方案1】:

    您可能会利用 db.createCollection 显式创建集合:

    > db.createCollection("asd")
    { "ok" : 1 }
    > db.createCollection("asd")
    { "errmsg" : "collection already exists", "ok" : 0 }
    

    只需根据 ok 字段检查命令是否成功。

    【讨论】:

      【解决方案2】:

      你应该不需要专门处理新的收集案例,我认为问题出在你的代码上。

      除了一些语法问题之外,主要问题是findCursor 传递给您的回调函数,而不是第一个匹配的文档。如果您只需要一个文档,则应改用 findOne

      这应该可行:

      exports.getInstruments = function (callback) {
          db.collection("settings", function(error, settings) {
              settings.findOne({ "settings" : "settings" }, function(err, doc) {
                  callback(doc && doc.instruments);
              });
          });
      };
      

      【讨论】:

        【解决方案3】:

        有一个exists() 函数可用于确定是否执行挂起的代码。

        > db.getCollection('hello').exists()
        null
        > db.getCollection('world').exists()
        { "name" : "testdb.world" }
        

        【讨论】:

        • let col = db.collection('foo'); console.log(col.exists()) 返回 col.exists 不是函数。这在 mongodb 本机驱动程序 2.2.25 中有效吗?
        • .exists() 在 MongoDB 原生驱动中不存在。
        猜你喜欢
        • 2020-11-17
        • 2014-02-17
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 2014-01-07
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多