Извиняюсь за запутанный заголовок, я не уверен, как это обобщить.
Предположим, у меня есть следующий список документов в коллекции:
{ "name": "Lorem", "source": "A" }
{ "name": "Lorem", "source": "B" }
{ "name": "Ipsum", "source": "A" }
{ "name": "Ipsum", "source": "B" }
{ "name": "Ipsum", "source": "C" }
{ "name": "Foo", "source": "B" }
, а также упорядоченный список из принятых источников, где более низкие индексы означают более высокий приоритет
sources = ["A", "B"]
Мой запрос должен:
- Взять список доступных источников и список требуемых имен
- Возвращать не более одного документа на имя.
- В случае нескольких совпадений должен быть выбран документ с наиболее приоритетным источником.
Пример:
wanted_names = ['Lorem', 'Ipsum', 'Foo', 'NotThere']
Результат:
{ "name": "Lorem", "source": "A" }
{ "name": "Ipsum", "source": "A" }
{ "name": "Foo", "source": "B" }
Результаты не обязательно должны быть упорядочены.
Возможно ли это сделать только с помощью запроса Mon go? Если так, то может ли кто-нибудь указать мне на ресурс, подробно описывающий, как выполнить sh it?
Мое текущее решение не поддерживает список имен, а вместо этого использует сценарий Python для выполнения нескольких запросов:
db.collection.aggregate([
{$match: {
"name": "Lorem",
"source": {
$in: sources
}}},
{$addFields: {
"order": {
$indexOfArray: [sources, "$source"]
}}},
{$sort: {
"order": 1
}},
{$limit: 1}
]);
Примечание: _id
поля опущены в этом вопросе для краткости