Node.js - Mongoose - проверьте, существует ли коллекция
Мне нужно вставить некоторые данные с помощью mongoose, но имя коллекции предоставляется пользователем в момент вставки, поэтому мне сначала нужно проверить, существует ли коллекция.
Я знаю, как проверить, существует ли коллекция, путем запроса коллекции system.namespaces
. Я вижу три возможных подхода к этому.
- Найдите способ запроса
system.namespaces
с помощью mongoose (возможно, определите схему, соответствующую той, что находится в db).
- Получение некоторого базового node -mongodb-native объекта из mongoose и выполнения запроса вручную. В любом случае, это то, что я хотел бы узнать, как это сделать.
- Использование отдельного экземпляра node -mongodb-native (или другого драйвера) для выполнения запроса
Число 3
является наименее изящным, и я пытаюсь избежать, я не хочу загружать другой экземпляр драйвера и не создавать новое соединение, когда mongoose уже создал его.
Я собираюсь попробовать номер 1
после написания этого. Я просто проверил system.namespaces
, и схема выглядит довольно просто.
Мне бы хотелось услышать некоторые мнения.
Спасибо!
Ответы
Ответ 1
Вариант 2, вероятно, самый чистый. Предполагая, что у вас есть объект Mongoose Connection
с именем conn
, который был открыт с помощью mongoose.createConnection
, вы можете получить доступ к собственному объекту mongo Db
через conn.db
. Оттуда вы можете позвонить collectionNames
, который должен предоставить то, что вы ищете:
conn.db.collectionNames(function (err, names) {
// names contains an array of objects that contain the collection names
});
Вы также можете передать имя коллекции в качестве параметра collectionNames
, чтобы отфильтровать результаты только для того, что вы ищете.
Обновление Mongoose 4.x
В версии 2.x встроенного драйвера MongoDB, который использует Mongoose 4.x, collectionNames
был заменен на listCollections
который принимает фильтр и возвращает курсор, поэтому вы должны сделать это как:
mongoose.connection.db.listCollections({name: 'mycollectionname'})
.next(function(err, collinfo) {
if (collinfo) {
// The collection exists
}
});
Ответ 2
Найти коллекцию в списке коллекции
public function CollectionExists($collectionName)
{
$mongo = new Mongo();
$collectionArr = $mongo->selectDB('yourrec')->listCollections();
if (in_array($collectionName, $collectionArr)) {
return true;
}
return false;
}