#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