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

5

我有一个函数,希望从MongoDB的settings集合中获取特定值。包含设置值的setting对象在settings集合中的标记是{'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);
    }); 
]);  
}

程序一直卡住,回调函数没有被调用。如果集合不存在,应该返回 "" 或 undefined,否则返回 doc.instrumens。

3个回答

9

有一个exists()函数可以用来确定是否执行可能会挂起代码的条件。

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

4
让col等于db.collection('foo');然后输出console.log(col.exists()),会得到"col.exists不是一个函数"的结果。在MongoDB原生驱动程序2.2.25版本中,这个操作有效吗? - Kunok
1
MongoDB原生驱动程序中不存在.exists()方法。 - Saeger

3
您可以利用db.createCollection显式创建集合:
> db.createCollection("asd")
{ "ok" : 1 }
> db.createCollection("asd")
{ "errmsg" : "collection already exists", "ok" : 0 }

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


2

我认为你不需要特别处理新集合的情况,问题可能出在你的代码上。

除了一些语法问题外,主要问题是find将一个Cursor传递给你的回调函数,而不是第一个匹配的文档。如果你只期望一个文档,应该使用findOne

这样应该可以解决问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接