4

我有一个函数,试图从 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。

4

3 回答 3

9

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

> db.getCollection('hello').exists()
null
> db.getCollection('world').exists()
{ "name" : "testdb.world" }
于 2013-06-06T16:18:01.050 回答
3

您可能会利用db.createCollectionwhich 显式创建一个集合:

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

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

于 2012-11-15T11:13:29.557 回答
2

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

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

这应该有效:

exports.getInstruments = function (callback) {
    db.collection("settings", function(error, settings) {
        settings.findOne({ "settings" : "settings" }, function(err, doc) {
            callback(doc && doc.instruments);
        });
    });
};
于 2012-11-15T13:43:14.953 回答