Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Mongodb, Node. Как узнать, что коллекции нет? (https://javascript.ru/forum/node-js-io-js/82096-mongodb-node-kak-uznat-chto-kollekcii-net.html)

voraa 11.03.2021 11:20

Mongodb, Node. Как узнать, что коллекции нет?
 
Пытаюсь сваять что то на 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

Цитата:

Сообщение от voraa
Нужно определить есть коллекция в базе или нет.

Как вариант...
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

Цитата:

Сообщение от ksa
или она "пуста"...

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

ksa 11.03.2021 12:27

Цитата:

Сообщение от voraa
Увы

Я же писал...
Цитата:

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


ksa 11.03.2021 12:28

Цитата:

Сообщение от voraa
database.getCollectionNames is not a function

Смотри еще вариант с поиском в коллекции, что я давал выше...

ksa 11.03.2021 12:31

Цитата:

Сообщение от voraa
Почему, хотя коллекции нет 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

Цитата:

Сообщение от voraa
Извращение какое то.

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


Часовой пояс GMT +3, время: 19:09.