2014-01-09 3 views
22

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

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

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

+0

требуется дополнительная информация: какая библиотека соединителей вы используете, и проверили ли вы ее документы manual/api? –

+0

@ Mike'Pomax'Kamermans Я использую библиотеку драйверов [mongo-native] (https://github.com/mongodb/node-mongodb-native), и я не смог найти такую ​​функциональность в ее документах API. –

ответ

13

В 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

+3

в [mongo-native] (https://github.com/mongodb/node-mongodb-native): 'db.collection ('system.namespaces'). Find(). ToArray (function (err, items) { }) ' –

+1

он не работал на WiredTIger с' namespace find' – newBike

+0

Поздно к вечеринке, но я думаю, что мой ответ ниже (http://stackoverflow.com/a/40141321/446717) имеет более прямой и чистый подход чтобы получить эту информацию – Roberto

17

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 
     } 
    }); 
+4

Это должен быть принятый ответ, так как это единственный ответ, который на самом деле имеет дело с node.js (например, запрошенный OP). – DanFromGermany

+0

также один вкладыш 'db.listCollections ({name: colName}). HasNext()' – cyberwombat

+0

@JohnyHK, если существует коллекция, как получить записи этой коллекции –

1

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

import pymongo 

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

Существует теперь 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; 
    })); 
    }); 
} 
4

С MongoDB 3.0 Вы можете просто запустить:

db.getCollectionNames() 

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

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

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

+1

Метод 'getCollectionNames()' недоступен в node.js родной lib. – DanFromGermany

+1

Эй, но я использую его из mongodb lib, который управляет базой данных mongo @DanFromGermany – Roberto

+0

Существует ['Db.collectionNames()'] (https://mongodb.github.io/node-mongodb -native/markdown-docs/collections.html # list-existing-collections) в более старом API, но не 'getCollectionNames()' вообще. – DanFromGermany

2

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

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