Подтвердить что ты не робот

Как проверить, существует ли коллекция в драйвере Mongodb native nodejs?

Мне нужно проверить, существует ли коллекция в определенной базе данных и создать ее, если это не так. Я знаю, что

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

проверяет наличие коллекции collName перед ее созданием и устанавливает объект error. но мне нужна независимая функция, чтобы проверить это.

4b9b3361

Ответ 1

В MongoDB 3.0 и более поздних версиях вам нужно запустить команду для перечисления всех коллекций в базе данных:

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

Хотя запрос system.namespaces будет работать, когда вы используете механизм хранения по умолчанию (MMAPv1), он не гарантированно работает для других движков, таких как 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

Метод collectionNames родного драйвера Db объект принимает необязательный фильтр имен коллекции в качестве первого параметра, чтобы вы могли проверить существование коллекции:

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

В версии 2.x родного драйвера MongoDB collectionNames был заменен на listCollections, который принимает фильтр и возвращает курсор, чтобы вы сделали это как:

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

Ответ 3

Так как MongoDB 3.0 можно просто запустить:

db.getCollectionNames()

который возвращает массив с именами всех коллекций текущей базы данных:

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

проверьте Mongo DB Documentation, или вы также можете использовать db.getCollectionInfos(), если вам нужна дополнительная информация о каждой коллекции

Ответ 4

Теперь существует listCollections метод в собственном драйвере Node.js. Он возвращает информацию обо всех коллекциях в текущей базе данных. Вы можете использовать его для проверки наличия данной коллекции:

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

Используя mongo-native драйвер и Node.js 7.6+, я использую следующее:

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

Ответ 6

Вопрос относится к собственному драйверу, но я нашел здесь, как это сделать в pymongo. Обычно pymongo api идентичен JS api, но в этом случае collection_names не имеет аргумента для имени коллекции (как в JohnnyHK answer), но, скорее, первый аргумент является логическим (включать системные коллекции). Поскольку строка оценивается как True, это может ввести в заблуждение. Поэтому я надеюсь, что это поможет будущим читателям:

import pymongo

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