Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.03.2021, 11:20
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

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') что то возвращает. И как тогда определить, что ее нет?

Последний раз редактировалось voraa, 11.03.2021 в 11:25.
Ответить с цитированием
  #2 (permalink)  
Старый 11.03.2021, 12:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от voraa
Нужно определить есть коллекция в базе или нет.
Как вариант...
db.getCollectionNames().indexOf('userDoc')

Вернет порядковый номер коллекции userDoc из массива коллекций текущей БД или -1, если таковой в БД нет.

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

Последний раз редактировалось ksa, 11.03.2021 в 12:22.
Ответить с цитированием
  #3 (permalink)  
Старый 11.03.2021, 12:25
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

voraa, еще вот так можно проверить...

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

Вернет null, если коллекции userDoc1 нет или она "пуста"...
Ответить с цитированием
  #4 (permalink)  
Старый 11.03.2021, 12:25
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Пробовал. Увы
database.getCollectionNames()

TypeError: database.getCollectionNames is not a function

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

Последний раз редактировалось voraa, 11.03.2021 в 12:28.
Ответить с цитированием
  #5 (permalink)  
Старый 11.03.2021, 12:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от voraa
Увы
Я же писал...
Сообщение от ksa
Команду я давал в оболочке Монго...
Если используется драйвер - нужно смотреть во что это он "переделывает".
Ответить с цитированием
  #6 (permalink)  
Старый 11.03.2021, 12:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от voraa
database.getCollectionNames is not a function
Смотри еще вариант с поиском в коллекции, что я давал выше...
Ответить с цитированием
  #7 (permalink)  
Старый 11.03.2021, 12:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от voraa
Почему, хотя коллекции нет database.collection('docs') что то возвращает.
Монге пофиг, есть коллекция или ее нет. Т.о. ты только получил ссылку на нее. А создаваться, удаляться или модернизироваться она будет при следующих твоих, соответствующих, командах...
Ответить с цитированием
  #8 (permalink)  
Старый 11.03.2021, 12:50
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

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

Последний раз редактировалось voraa, 11.03.2021 в 17:39.
Ответить с цитированием
  #9 (permalink)  
Старый 11.03.2021, 12:53
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от voraa
Извращение какое то.
Да брось...
Просто там много чего возвращается, а тебе нужны только имена.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка фала. Узнать существует он или нет. Node js vlzkonopatov AJAX и COMET 0 28.11.2014 12:05
как узнать что... finestra Общие вопросы Javascript 1 30.04.2014 00:23
Как узнать что документ проскролили? CrazyBite AJAX и COMET 3 06.12.2013 09:03
Сторонние библиотеки - быть или не быть? IIIEPJIOK Оффтопик 64 21.03.2009 19:39
Как узнать свернуто окно браузера или нет. bar-boss Events/DOM/Window 3 25.09.2008 16:09