node.js - top - mongoose update
Node.js-Mongoose-Comprueba si existe una colección (3)
Encuentra la colección en la lista de la colección
public function CollectionExists($collectionName)
{
$mongo = new Mongo();
$collectionArr = $mongo->selectDB(''yourrec'')->listCollections();
if (in_array($collectionName, $collectionArr)) {
return true;
}
return false;
}
Necesito insertar algunos datos usando mangosta, pero el usuario proporciona el nombre de la colección en el momento de la inserción, por lo que primero debo verificar si existe la colección.
La forma en que sé cómo verificar si existe una colección es consultando la colección system.namespaces
. Puedo ver 3 posibles enfoques para hacer eso.
- Encuentre una manera de consultar
system.namespaces
usando mongoose (tal vez definiendo un esquema que coincida con el de la base de datos). - Obtención de algún objeto subyacente de mongodb-native de la mangosta y realizar la consulta manualmente. En cualquier caso, esto es algo que me gustaría aprender a hacer.
- Usar una instancia separada de un nodo-mongodb-native (o algún otro controlador) para realizar la consulta
El número 3
es el menos elegante y el que trato de evitar, no quiero cargar otra instancia del controlador ni crear una nueva conexión cuando Mangoose ya creó una.
Voy a intentar el número 1
después de escribir esto. Acabo de verificar system.namespaces
y el esquema parece bastante simple
Todavía me gustaría escuchar algunas opiniones.
¡Gracias!
Esto funciona para mí (mongoose versión 5.1.1):
const mongoose = require(''mongoose'');
const mongoURI = ''mongodb://localhost:27017/mydb''
// notice the mongoose.createConnection instead of mongoose.connect
const conn = mongoose.createConnection(mongoURI);
conn.on(''open'', function () {
conn.db.listCollections().toArray(function (err, collectionNames) {
if (err) {
console.log(err);
return;
}
console.log(collectionNames);
conn.close();
});
});
La opción 2 es probablemente la más limpia. Suponiendo que tiene un objeto de Connection
Mongoose llamado conn
que se abrió con mongoose.createConnection
, puede acceder al objeto Db
mongo nativo a través de conn.db
Desde allí puede llamar a collectionNames
que debe proporcionar lo que está buscando:
conn.db.collectionNames(function (err, names) {
// names contains an array of objects that contain the collection names
});
También puede pasar un nombre de colección como parámetro a collectionNames
para filtrar los resultados a lo que está buscando.
Actualización de Mongoose 4.x
En la versión 2.x del controlador nativo de MongoDB que utiliza Mongoose 4.x, collectionNames
ha sido reemplazado por listCollections
que acepta un filtro y devuelve un cursor, por lo que haría esto como:
mongoose.connection.db.listCollections({name: ''mycollectionname''})
.next(function(err, collinfo) {
if (collinfo) {
// The collection exists
}
});