Группировать по упорядоченным элементам несмежного массива в MongoDB

#mongodb #mapreduce #mongodb-query #aggregation-framework

#mongodb #mapreduce #mongodb-запрос #агрегация-фреймворк

Вопрос:

У меня проблема, и я хочу знать, могу ли я решить ее в MongoDB aggregation framework или на уровне MapReduce вместо того, чтобы делать это в коде сервера. Проблема: у меня есть следующая коллекция:

 [
  {
    id:...,
    pages:[
       000,
       111,
       222,
       666,
       999....
    ]
  },
  {
    id:...,
    pages:[
       111,
       666,
       999....
    ]
  },
  .
  .
  .
]
  

Я хочу иметь возможность запрашивать этот путь: 111, 999, и агрегация вернет количество 2, почему!? потому что 111 и 999 отображаются в двух документах в этом порядке и независимо от того, сколько элементов между ними.
Также я хочу иметь возможность запрашивать 000, 222, 999, и это вернет только 1 (количество), потому что эти три элемента массива в таком порядке отображаются только в одном документе.

ПОРЯДОК является обязательным в моем случае, если у меня есть другой документ со страницами: [999, 666, 111], и я хочу найти $ all 666, 999 я не хочу, чтобы этот документ был частью результата, потому что 999, 666 — это не то же самое, что 666, 999

Это означает, что я не могу сортировать массивы, важен порядок, и я хочу найти массивы, содержащие указанные элементы, но в таком порядке

Надеюсь, я правильно объяснил свою проблему…. Каков наилучший способ сделать это на уровне MongoDB, это агрегация? или, может быть, map reduce или это возможно?

Заранее спасибо

Ответ №1:

Оператор $all выбирает документы, в которых значением поля является массив, содержащий все указанные элементы.

https://docs.mongodb.com/master/reference/operator/query/all/

 db.Test6.count({pages: {$all: [111, 999]}}); // 2
db.Test6.count({pages: {$all: [000, 222, 999]}}); // 1
  

Что касается упорядоченной проверки, мое предложение состоит в том, чтобы предположить, что массив уже упорядочен (это упростит / ускорит выполнение запроса).

Чтобы отсортировать массив, вы должны убедиться, что при нажатии на элемент:https://docs.mongodb.com/master/reference/operator/update/sort/#up._S_sort

Комментарии:

1. Хорошо, у меня все еще есть проблема здесь, я не могу отсортировать массивы, потому что 111, 999 — это не то же самое, что 999, 111. Если я отсортирую массивы, это всегда будет 111, 999, но в моем случае это не так.

2. Что я на самом деле хочу, так это $ all, но с учетом порядка элементов, если я сделаю

3. $all: [111, 999], не должен возвращать массив с 999, 111