Запрос MongoDB с несколькими вариациями в $ или запрос, где должны совпадать хотя бы x операторов - PullRequest
1 голос
/ 14 февраля 2020

Указанные данные:

{_id: 1, group: {value1: true, value2: true, value3: false, value4: true, value5: false, value6: true}}
{_id: 2, group: {value1: true, value2: true, value3: false, value4: true, value5: false, value6: true}}
{_id: 3, group: {value1: false, value2: false, value3: true, value4: false, value5: false, value6: true}}

Теперь мы хотим запросить все документы, для которых следующий объект соответствует

 $or: [
    {value1: true},
    {value2: true},
    {value3: true},
    {value4: true}
  ]

, но с опцией, по крайней мере, например, 3 (переданный параметр - minMatchCount) из 6 операторов должны совпадать. Обратный путь: оператор 1 может завершиться неудачей.

Есть ли решение без создания огромного $and - $or запроса с каждым возможным вариантом?

Пример вывода:

[
 {_id:1, ...},
 {_id:2, ...}
]

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете использовать $expr, $sum и $cond для подсчета совпадений и $gte, чтобы требовать минимум:

db.collection.find({
  $expr: {
    $gte: [
      {$sum: [
          { $cond: [ { $eq: [ "$group.value1", true ] }, 1, 0 ] },
          { $cond: [ { $eq: [ "$group.value2", true ] }, 1, 0 ] },
          { $cond: [ { $eq: [ "$group.value3", true ] }, 1, 0 ] },
          { $cond: [ { $eq: [ "$group.value4", true ] }, 1, 0 ] },
          ]},
      3 ] } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...