Nœud.js-Mongoose-vérifier l'existence D'une collection
j'ai besoin d'insérer quelques données en utilisant mongoose mais le nom de la collection est fourni par l'utilisateur au moment de l'insertion, donc je dois d'abord vérifier si la collection existe.
la façon dont je sais comment vérifier si une collection existe est en questionnant le system.namespaces
de la collection. Je peux voir 3 approches possibles pour faire cela.
- trouver un moyen d'interroger
system.namespaces
en utilisant mongoose (peut-être en définissant un schéma qui correspond à celui de la base de données). - obtenir certains noeud sous-jacent-mongodb - objet natif de mongoose et l'exécution de la requête manuellement. En tout cas, c'est quelque chose que j'aimerais apprendre à faire.
- en utilisant une instance séparée d'un noeud-mongodb-natif (ou un autre pilote) pour effectuer la requête
3
est le moins élégant et celui que j'essaie d'éviter, Je ne veux pas charger une autre instance du pilote ni créer une nouvelle connexion lorsque mongoose déjà créé un.
je vais essayer 1
après avoir écrit cela. Je viens de vérifier system.namespaces
et le schéma semble assez simple
j'aimerais encore entendre quelques opinions.
Merci!
3 réponses
L'Option 2 est probablement la plus propre. En supposant que vous ayez une mangouste!--2--> objet conn
qui a été ouvert en utilisant mongoose.createConnection
, vous pouvez accéder au mongo natif Db
objet conn.db
. De là, vous pouvez appeler collectionNames
qui doit fournir ce que vous êtes à la recherche de:
conn.db.collectionNames(function (err, names) {
// names contains an array of objects that contain the collection names
});
vous pouvez aussi passer un nom de collection comme paramètre à collectionNames
pour filtrer les résultats pour juste ce que vous cherchez.
Mangouste 4.x Mise à jour
dans le 2.version x du pilote natif MongoDB que Mongoose 4.x utilise, collectionNames
a été remplacé par listCollections
qui accepte un filtre et renvoie un curseur pour que vous fassiez ceci comme:
mongoose.connection.db.listCollections({name: 'mycollectionname'})
.next(function(err, collinfo) {
if (collinfo) {
// The collection exists
}
});
Cela fonctionne pour moi (mangouste version 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();
});
});
trouver collection dans la liste de collection
public function CollectionExists($collectionName)
{
$mongo = new Mongo();
$collectionArr = $mongo->selectDB('yourrec')->listCollections();
if (in_array($collectionName, $collectionArr)) {
return true;
}
return false;
}