Как проверить, существует ли коллекция в драйвере Mongodb native nodejs?
Мне нужно проверить, существует ли коллекция в определенной базе данных и создать ее, если это не так. Я знаю, что
db.createCollection(collName, {strict:true}, function(error, collection))
проверяет наличие коллекции collName
перед ее созданием и устанавливает объект error
. но мне нужна независимая функция, чтобы проверить это.
Ответы
Ответ 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):
...