Подтвердить что ты не робот

Node.js - Mongoose - проверьте, существует ли коллекция

Мне нужно вставить некоторые данные с помощью mongoose, но имя коллекции предоставляется пользователем в момент вставки, поэтому мне сначала нужно проверить, существует ли коллекция.

Я знаю, как проверить, существует ли коллекция, путем запроса коллекции system.namespaces. Я вижу три возможных подхода к этому.

  • Найдите способ запроса system.namespaces с помощью mongoose (возможно, определите схему, соответствующую той, что находится в db).
  • Получение некоторого базового node -mongodb-native объекта из mongoose и выполнения запроса вручную. В любом случае, это то, что я хотел бы узнать, как это сделать.
  • Использование отдельного экземпляра node -mongodb-native (или другого драйвера) для выполнения запроса

Число 3 является наименее изящным, и я пытаюсь избежать, я не хочу загружать другой экземпляр драйвера и не создавать новое соединение, когда mongoose уже создал его.

Я собираюсь попробовать номер 1 после написания этого. Я просто проверил system.namespaces, и схема выглядит довольно просто.

Мне бы хотелось услышать некоторые мнения.

Спасибо!

4b9b3361

Ответ 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;
    }