NodeJS + Mongo native - 在查询之前检查集合是否存在

时间:2012-11-15 09:56:25

标签: node.js mongodb collections

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

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

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

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

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

3 个答案:

答案 0 :(得分:9)

您可以使用exists()函数来确定是否执行挂起的代码。

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

答案 1 :(得分:2)

您不需要专门处理新的收集案例,我认为问题在于您的代码。

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

这应该有效:

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

答案 2 :(得分:0)

您可以利用显式创建集合的db.createCollection

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

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