update top node node.js mongodb mongoose

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.

  1. Encuentre una manera de consultar system.namespaces usando mongoose (tal vez definiendo un esquema que coincida con el de la base de datos).
  2. 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.
  3. 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 } });