Как выполнять запросы с большими $ в наборе данных в пн go дБ - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть простой запрос, подобный этому: {"field": {$nin: ["value1","value2","valueN"]}}.

Проблема в том, что необходимо исключить большое количество уникальных значений (используя оператор $nin). Это около 50000 уникальных значений для фильтрации и около 1 КБ длины запроса.

Вопрос : Существует ли элегантный и производительный способ выполнения таких операций?

Пример . Коллекция daily_stat с 56M документов. Каждый день коллекция увеличивается на 100 тыс. Документов. Пример документа

{
    "day": "2020-04-15",
    "username": "uniq_name",
    "total": 12345
}

Я запускаю следующий запрос:

{
  "date": "2020-04-15",
  "username": {
    $nin: [
      "name1",
      "name2",
      "...",
      "name50000"
    ]
  }
}

Версия MongoDB: 3.6.12

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Я бы сказал, что большой массив $nin - это элегантное решение. Если на field есть индекс, то он также будет производительным, но только с точки зрения быстрого исключения тех документов, которые не будут возвращаться в курсоре. Если у вас есть, скажем, 10 миллионов документов в коллекции, и вы делаете find(), чтобы исключить 50000, вы все равно перетаскиваете 9 950 000 записей из БД и через провод; это нетривиально.

0 голосов
/ 16 апреля 2020

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

db.persons.find({'field':{$nin:[/san/i]}},{_id:0,"field":1})

подробнее о регулярном выражении в

https://docs.mongodb.com/manual/reference/operator/query/regex/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...