如何检查Mongodb native nodejs驱动程序中是否存在集合?

时间:2014-01-09 15:13:02

标签: node.js mongodb node-mongodb-native

我需要检查某个数据库中是否存在集合,如果不存在则创建它。我知道

db.createCollection(collName, {strict:true}, function(error, collection))

在创建集合collName之前检查它是否存在并设置error对象。但是我需要一个独立的功能来检查它。

11 个答案:

答案 0 :(得分:29)

本机驱动程序的Db对象的collectionNames方法接受可选的集合名称过滤器作为第一个参数,以便检查集合是否存在:

db.collectionNames(collName, function(err, names) {
    console.log('Exists: ', names.length > 0);
});

在MongoDB本机驱动程序的2.x版本中,collectionNames已替换为listCollections,它接受​​过滤器并返回游标,因此您可以这样做:

db.listCollections({name: collName})
    .next(function(err, collinfo) {
        if (collinfo) {
            // The collection exists
        }
    });

答案 1 :(得分:12)

在MongoDB 3.0及更高版本中,您必须运行命令以列出数据库中的所有集合:

use test;
db.runCommand( { listCollections: 1 } );

虽然使用默认存储引擎(MMAPv1)时查询system.namespaces仍然有效,但不保证可以用于其他引擎,例如WiredTiger。

在MongoDB 3.0之前,您需要执行以下操作:

您可以查询system.namespaces集合:

use test;
db.system.namespace.find( { name: 'test.' + collName } );

喜欢在:

db.system.namespaces.find( { name: 'test.testCollection' } );

返回:

{ "name" : "test.testCollection", "options" : { "flags" : 1 } }

当然,没什么。

另请参阅:https://github.com/mongodb/specifications/blob/master/source/enumerate-collections.rst

答案 2 :(得分:8)

使用mongo-native驱动程序和Node.js 7.6+,我使用以下内容:

const collections = await db.collections();
if (!collections.map(c => c.s.name).includes(collName)) {
    await db.createCollection(collName);
}

答案 3 :(得分:6)

从MongoDB 3.0开始,您只需运行:

db.getCollectionNames()

返回一个数组,其中包含当前数据库中所有集合的名称:

[ "employees", "products", "mylogs"]

检查Mongo DB Documentation,或者如果您需要有关每个集合的更多信息,也可以使用db.getCollectionInfos()

答案 4 :(得分:5)

Node.js本机驱动程序中现在有一个listCollections方法。它返回当前数据库中所有集合的信息。您可以使用它来检查给定的集合是否存在:

collectionExists = function(name, cb) {
  mongoDb.listCollections().toArray(function(err, collections) {
    if (err) return cb(err);

    cb(null, collections.some(function(coll) {
      return coll.name == name;
    }));
  });
}

答案 5 :(得分:1)

问题涉及本机驱动程序,但我在这里搜索如何在pymongo中执行此操作。通常pymongo的api与JS api相同,但在这种情况下collection_names没有集合名称的参数(如JohnnyHK的{​​{3}} ),而是第一个参数是布尔值(是否包括系统集合)。由于字符串的计算结果为True,因此可能会造成混淆。所以我希望这有助于未来的读者:

import pymongo

cl = pymongo.MongoClient()
db = cl['my-db']
if 'my-col' in db.collection_names(False):
   ...

答案 6 :(得分:1)

如果您使用mongodb 3.1.10。 这是检查集合是否存在的方法。

MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
  if (err) throw err;

  var dbo = client.db("dbname");
  dbo.listCollections().toArray(function(err, items){
    if (err) throw err;

    console.log(items); 
    if (items.length == 0)
        console.log("No collections in database")  
  }); 
});

答案 7 :(得分:0)

适用于3.6。*版本的最新答案。

/**
 * Checks if a collection exists in a mongo database.
 * 
 * @param db a mongo db object.  eg.
 *    client = await MongoClient.connect(uri);
 *    db = client.db();
 * @param collectionName the name of the collection to search for
 * @returns {Promise<boolean>}
 */
async function doesCollectionExistInDb(db, collectionName) {
  const collections = await db.collections();
  return collections.some(
      (collection) => collection.collectionName === collectionName
  );
}

...

if (await doesCollectionExistInDb(db, 'products')) {
   // Do something, such as create a new collection
}

collection.collectionName是记录的收集api的一部分,可以在这里找到:http://mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#collectionName

答案 8 :(得分:0)

对于具有mongodb库(v 3.6.3)的nodejs,这是我使其工作的唯一方法:

const collectionName = 'products'
const exists = (await (await db.listCollections().toArray()).findIndex((item) => item.name === collectionName) !== -1)
console.log(exists)

希望对别人有帮助

答案 9 :(得分:0)

/* set database */
let db          = client.db( 'crud' )

/* set collection */
let collection  = db.collection( 'categories' )

/* set query */
collection.find( {} ).toArray( ( err, result ) => {

if ( result.length > 0 )
{
    console.log("Exist");
}
else
{
    console.log("Not Exist");

    // create collection
}

}

答案 10 :(得分:0)

实际上,这对我有用

  await db.createCollection(name, function (err, res) {
    if (err) {
        //console.log(err);
        if (err.codeName =="NamespaceExists") {
            console.log("Already Exists Collection  : " + name + "");
            return;
        }
    }
    console.log("Collection created! : "+name+"");

});