node.js - nodejs - node js mongodb tutorial español
¿Cómo comprobar si existe una colección en el controlador de nodejs nativo de Mongodb? (6)
Ahora hay un método listCollections en el controlador nativo Node.js. Devuelve información sobre todas las colecciones en la base de datos actual. Puedes usarlo para verificar si una colección determinada está ahí:
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;
}));
});
}
Necesito verificar si existe una colección en una determinada base de datos y crearla si no existe. Yo sé eso
db.createCollection(collName, {strict:true}, function(error, collection))
comprueba la existencia de la colección collName
antes de crearlo y establece el objeto de error
. Pero necesito una función independiente para comprobar eso.
Al usar el controlador mongo-native y Node.js 7.6+, uso lo siguiente:
const collections = await db.collections();
if (!collections.map(c => c.s.name).includes(collName)) {
await db.createCollection(collName);
}
Desde MongoDB 3.0 puedes simplemente ejecutar:
db.getCollectionNames()
que devuelve una matriz con los nombres de todas las colecciones en la base de datos actual:
[ "employees", "products", "mylogs"]
verifique la documentación de Mongo DB , o también podría usar db.getCollectionInfos () si necesita más información sobre cada colección
El método collectionNames
del objeto Db
del controlador nativo acepta un filtro de nombre de colección opcional como primer parámetro para permitirle verificar la existencia de una colección:
db.collectionNames(collName, function(err, names) {
console.log(''Exists: '', names.length > 0);
});
En la versión 2.x del controlador nativo de MongoDB, collectionNames
ha sido reemplazado por listCollections
que acepta un filtro y devuelve un cursor para que haga esto como:
db.listCollections({name: collName})
.next(function(err, collinfo) {
if (collinfo) {
// The collection exists
}
});
La pregunta se refiere al controlador nativo, pero llegué aquí buscando cómo hacer esto en pymongo
. Por pymongo
general, la API de pymongo
es idéntica a la API de JS, pero en este caso, collection_names
no tiene un argumento para el nombre de la colección (como en la answer JohnnyHK
), sino que el primer argumento es un booleano (ya sea para incluir colecciones del sistema ). Dado que una cadena se evalúa como True
, esto puede ser confuso. Así que espero que esto ayude a los futuros lectores:
import pymongo
cl = pymongo.MongoClient()
db = cl[''my-db'']
if ''my-col'' in db.collection_names(False):
...
En MongoDB 3.0 y versiones posteriores, debe ejecutar un comando para enumerar todas las colecciones en una base de datos:
use test;
db.runCommand( { listCollections: 1 } );
Aunque la consulta de system.namespaces
seguirá funcionando cuando use el motor de almacenamiento predeterminado (MMAPv1), no se garantiza que funcione para otros motores, como WiredTiger.
Antes de MongoDB 3.0 debes hacer lo siguiente:
Puedes consultar la colección system.namespaces
:
use test;
db.system.namespace.find( { name: ''test.'' + collName } );
Como en:
db.system.namespaces.find( { name: ''test.testCollection'' } );
Que devuelve:
{ "name" : "test.testCollection", "options" : { "flags" : 1 } }
O por supuesto, nada.
Véase también: https://github.com/mongodb/specifications/blob/master/source/enumerate-collections.rst