Вход

Просмотр полной версии : Mongodb, Node. Как узнать, что коллекции нет?


voraa
11.03.2021, 11:20
Пытаюсь сваять что то на node и mongo.
Спецом не являюсь ни в том, ни в другом.
Поэтому сразу куча затык.
Нужно определить есть коллекция в базе или нет. Потому, что когды пытаюсь удалить несуществующую, вылетают ошибки. А как определить, что ее нет

Такой код (последовательность действий)

let client, database, col;

client = new MongoClient(url);
await client.connect();
database = client.db(names.database)
col = database.collection('docs');
await col.insertOne(doc); // создаю коллекцию и записываю документ
await client.close();
// ............
// Смотрю в компасе. Коллекция есть, документ есть
// .............
client = new MongoClient(url);
await client.connect();
database = client.db(names.database)
await database.dropCollection('docs') // Удаляю коллекцию
await client.close();
// ............
// Смотрю в компасе. Коллекции нет
// ............
client = new MongoClient(url);
await client.connect();
database = client.db(names.database)
col = database.collection('docs');
console.log(col) // чего то возвращает
if (col) {
database.dropCollection('docs') //Выдает ошибку 'NamespaceNotFound' типа нет такой коллекции.
}
await client.close();


Весь вопрос в строках 23-25. Почему, хотя коллекции нет database.collection('docs') что то возвращает. И как тогда определить, что ее нет?

ksa
11.03.2021, 12:19
Нужно определить есть коллекция в базе или нет.
Как вариант...
db.getCollectionNames().indexOf('userDoc')
Вернет порядковый номер коллекции userDoc из массива коллекций текущей БД или -1, если таковой в БД нет.

P.S.
Команду я давал в оболочке Монго...
Если используется драйвер - нужно смотреть во что это он "переделывает".

ksa
11.03.2021, 12:25
voraa, еще вот так можно проверить...

db['userDoc1'].findOne({})

Вернет null, если коллекции userDoc1 нет или она "пуста"...

voraa
11.03.2021, 12:25
Пробовал. Увы
database.getCollectionNames()

TypeError: database.getCollectionNames is not a function

или она "пуста"...
Вот про пуста
await database.collection(name).estimatedDocumentCount()
пока сделал.
Но вопрос в том, есть она вообще? Можно ли ее удалить. Надо ли ее создавать?

ksa
11.03.2021, 12:27
Увы
Я же писал...
Команду я давал в оболочке Монго...
Если используется драйвер - нужно смотреть во что это он "переделывает".

ksa
11.03.2021, 12:28
database.getCollectionNames is not a function
Смотри еще вариант с поиском в коллекции, что я давал выше...

ksa
11.03.2021, 12:31
Почему, хотя коллекции нет database.collection('docs') что то возвращает.
Монге пофиг, есть коллекция или ее нет. Т.о. ты только получил ссылку на нее. А создаваться, удаляться или модернизироваться она будет при следующих твоих, соответствующих, командах...

voraa
11.03.2021, 12:50
Извращение какое то. Список имен всех коллекций.
let cnames = (await database.collections()).map(c => c.namespace.split('.')[1])

ksa
11.03.2021, 12:53
Извращение какое то.
Да брось... :D
Просто там много чего возвращается, а тебе нужны только имена.