в оперативной памяти со списком в БД
(и найти те, которые есть в памяти и нет в БД)
Как это правильнее сделать?
Просто выгрузить все элементы из БД? И выполнить сравнение на стороне Питона?
Или можно как-то выполнить сравнение списков на стороне Монги?
Элементов - несколько тысяч, до 10к
.find(field_name: {'$in': [1, 2, 3]})
если я в $in передам список из 5к элементов, это ок будет?
если не ок, что мешает сделать по кускам?
не знаю поэтому и спрашиваю
ну попробуй, скорее всего 10к это нормально вообще почти всегда стоит делать по максимуму на стороне бд
есть список А в оперативной памяти (переменной) и список B в БД как найти элементы, которые есть в A, но нет B? найти пересечение A и B (запросом к БД) и потом вычесть это пересечение из A? (уже Питоном) все равно придется на стороне Питона часть расчетов проводить?
Тебе в любом случае надо будет вычитать все документы в базе. А вот заставлять монгу каждый документ сравнивать со списком на 10к элементов - это херовая идея. Проще одним запросом вычитывать документы из базы (используй projection, что бы не доставать все поля, а только нужные). Вычитывать как итерататор, не надо превращать результат в список. Исходный список в памяти превращаешь в set. В теле цикла удаляешь из set-a элемент полученный из базы. По завершению цикла в set-е останутся те элементы, которых нет в базе. Примерно так: source = set(source_list) for doc in collection.find({...}, projection={'value': 1}): source.remove(doc['value'])
Обсуждают сегодня