#database #mongodb #express #mongoose #mongodb-query
#База данных #mongodb #экспресс #мангуст #mongodb-запрос
Вопрос:
У меня есть коллекция с примерно 40 тыс. документов, которые выглядят следующим образом:
{
"_id":{"$oid":"5e988b703117c034b0630f8"},
"name":"London Heathrow Airport",
"country":"United Kingdom",
"iata":"LHR",
...
}
Я хочу иметь возможность работать с массивом (фактически картой Javascript, которая может содержать много сотен элементов) следующим образом:
["LHR", "LGW", "BFS", ...]
Элементы в этом массиве относятся к свойству iata в документе.
Я хочу вернуть массив, в котором возвращаются элементы, которые не могут быть найдены в коллекции, и если все элементы могут быть найдены, то вернуть либо нулевое значение, либо пустой массив. Так, например, если «LHR» и «LGW» соответствуют свойству iata документа в коллекции, но «BFS» этого не делает, он должен возвращать [«BFS»]
Я мог бы взаимодействовать с массивом, создавая отдельный запрос для каждого элемента в массиве, но если входной массив содержит много сотен элементов, это кажется очень неэффективным. Есть ли лучший способ !?
Спасибо
Ответ №1:
Вы можете запросить в своей коллекции совпадающие коды iata и выполнить различие между результатом и вашим массивом кодов iata:
Дана коллекция airports
со следующими документами:
{
"_id": 1,
"name":"London Heathrow Airport",
"country":"United Kingdom",
"iata":"LHR",
},
{
"_id": 2,
"name":"Ljubljana Airport",
"country":"Slovenia",
"iata":"LJU",
},
Учитывая iata
приведенный ниже массив:
var iatas = ["LHR", "LJU", "BFS"];
Найдите соответствующие документы и верните результат в виде массива iata
значений:
var result = [];
db.airports.find({
"iata": {
$in: iatas
}
}).toArray().map(
function(u) {
result.push(u.iata)
}
);
Результат будет выглядеть так:
//result
[
"LHR",
"LJU"
]
Теперь вы можете провести различие между result
и iatas
:
var nonexistentIatas = iatas.filter(x => !result.includes(x));
Содержание nonExistentIatas
будет:
[
"BFS"
]
Комментарии:
1. Это похоже на удивительно простой ответ, о котором я должен был подумать! ЛЮ тоже прекрасен! Большое спасибо за вашу помощь!