Убедитесь, что в коллекции существует массив документов

#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. Это похоже на удивительно простой ответ, о котором я должен был подумать! ЛЮ тоже прекрасен! Большое спасибо за вашу помощь!