【问题标题】:Finding multiple documents with one query一次查询查找多个文档
【发布时间】:2015-08-06 05:02:52
【问题描述】:

我有这样的架构:

schema
{
    owner: <id to other document type>
    created: date
}

我有一个所有者 ID 数组:[owner_id_1, owner_id_2, ... owner_id_x]

我想获取这些所有者的文档列表,但仅限于每个文档的最新版本。单独进行查询:

find_one({ owner: owner_id_1 }).sort({ created: -1 }).limit(1)

但我不想触发其中的 x 个,如果可能的话,我希望有一种方法可以在一个查询中完成

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    .aggregate() 方法允许您执行此操作,同时通过 $in 运算符匹配文档:

    collection.aggregate([
        { "$match": { "owner": { "$in": [owner_id_1, owner_id_2, ... owner_id_x] } },
        { "$group": {
            "_id": "$owner",
            "created": { "$max": "$created" }
        }}
    ])
    

    获取您使用$in 请求的每个“所有者”的最大($max)“创建”值,它采用一组值来匹配条件中的字段。

    如果您想要更多的数据而不仅仅是一个字段,请在 $group 之前使用 $sort

    collection.aggregate([
        { "$match": { "owner": { "$in": [owner_id_1, owner_id_2, ... owner_id_x] } },
        { "$sort": { "owner": 1, "created": -1 } },
        { "$group": {
            "_id": "$owner",
            "created": { "$first": "$created" },
            "docId": { "$first": "$_id" },
            "something": { "$first": "$something" }
        }}
    ])
    

    $first 从每个分组边界获取第一个值(降序在 sort 中完成)。

    【讨论】:

    • 因此,如果我有多个具有相同父级的文档,这仍然会给我一个文档列表,每个文档都有一个父级(没有一个父级),并且每个文档都是最早和那个父母在一起?
    • @FranciscoRyanTolmaskyI 这在做什么(正如您在尝试时会看到的那样)与您的单个查询完全相同,但在一个操作中。 $in 一次选择所有这些,$group 只为每个不同的分组值获取一组值。你给$in的论点是什么。
    • 酷,这有性能损失吗?例如,如果有 100 个拥有 owner_id_1 的文档,则必须为它们进行分组等。如果,假设架构有一个 isFirstDocument 布尔值,那么查询将只是 { owner: $in: [blah,blah], isFirstDocument: true },但我不知道添加该字段是否浪费,因为这东西你刚刚向我展示了速度很快
    • @FranciscoRyanTolmaskyI 在执行 100 次单独查询时,性能损失会增加 很多。也就是说,有时并行操作效果很好。我建议您进行自己的基准测试,看看您是否可以处理 100 个数据库连接来执行此操作。我只是在回答您提出的问题,即“如何在单个查询中执行此操作”。这就是你的做法。是的,$in 可以正常工作,只要您有另一个选择器来识别您想要的文档。但同样,您在这里以一个价格得到两个答案,因此进行基准测试并决定使用什么。
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多