【问题标题】:Ensure an array of documents exist in a collection确保集合中存在文档数组
【发布时间】:2021-04-02 22:46:59
【问题描述】:

我有一个包含大约 40k 文档的集合,如下所示:

{

    "_id":{"$oid":"5e988b703117c034b0630f8"},
    "name":"London Heathrow Airport",
    "country":"United Kingdom",
    "iata":"LHR",
    ...
}

我希望能够像这样处理一个数组(实际上是一个 Javascript Map,它可能有数百个元素):

["LHR", "LGW", "BFS", ...]

此数组中的项目与文档上的 iata 属性相关。

我想返回一个数组,其中返回集合中找不到的元素,如果可以找到所有元素,则返回空值或空数组。例如,如果 "LHR" 和 "LGW" 匹配集合中文档的 iata 属性,但 "BFS"​​ 不匹配,它应该返回 ["BFS"​​]

我可以对数组进行交互,对数组中的每个项目进行单独的查询,但是如果输入数组有数百个元素,这似乎非常低效。有没有更好的办法!?

谢谢

【问题讨论】:

    标签: database mongodb express mongoose mongodb-query


    【解决方案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"
    ]
    

    现在您可以在 resultiatas 之间进行区分:

    var nonexistentIatas = iatas.filter(x => !result.includes(x));
    

    nonExistentIatas 的内容为:

    [
        "BFS"
    ]
    

    【讨论】:

    • 这看起来是我应该想到的非常简单的答案! LJU也很漂亮!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2021-11-10
    • 2016-05-07
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多