【问题标题】:Counting $lookup and $unwind documents filtered with $match without getting rid of parent document when all results match当所有结果都匹配时,计算使用 $match 过滤的 $lookup 和 $unwind 文档而不删除父文档
【发布时间】:2022-04-27 19:48:00
【问题描述】:

我有一个集合“所有者”,我想返回一个匹配过滤器(任何过滤器)的“所有者”列表,以及该所有者的“宠物”集合中的“宠物”计数,但我没有不想死宠物。 (虚构的例子)

我需要返回的文档看起来与添加了“petCount”字段的“所有者”文档完全一样,因为我使用的是带有 Mongo Java 驱动程序的 Java Pojos。

我使用的 AWS DocumentDB 尚不支持 $lookup 和过滤器。如果是这样,我会使用它并且我会完成:

        db.Owners.aggregate( [
            { $match: {_id: UUID("b13e733d-2686-4266-a686-d3dae6501887")} },
            { $lookup: { from: 'Pets', as: 'pets', 'let': { ownerId: '$_id' }, pipeline: [ { $match: { $expr: { $ne: ['$state', 'DEAD'] } } } ] } },
            { $addFields: { petCount: { $size: '$pets' } } },
            { $project: { pets: 0 } }
        ]).pretty()

但由于它不是我到目前为止得到的:

        db.Owners.aggregate( [
            { $match: {_id: { $in: [ UUID("cbb921f6-50f8-4b0c-833f-934998e5fbff") ] } } },
            { $lookup: { from: 'Pets', localField: '_id', foreignField: 'ownerId', as: 'pets' } },
            { $unwind: { path: '$pets', preserveNullAndEmptyArrays: true } },
            { $match: { 'pets.state': { $ne: 'DEAD' } } },
            { "$group": {
                "_id": "$_id",
                "doc": { "$first": "$$ROOT" },
                "pets": { "$push": "$pets" }
                }
            },
            { $addFields: { "doc.petCount": { $size: '$pets' } } },
            { $replaceRoot: { "newRoot": "$doc" } },
            { $project: { pets: 0 } }
        ]).pretty()

这很好用,除非所有者只有“死”宠物,否则不会返回所有者,因为所有“文档副本”都被 $match 过滤掉了。当所有文档都为“DEAD”时,我需要使用 petCount = 0 返回父文档。我不知道该怎么做。

有什么想法吗?

这些是 DocDB 4.0 https://docs.amazonaws.cn/en_us/documentdb/latest/developerguide/mongo-apis.html 支持的操作

【问题讨论】:

    标签: mongodb-query aws-documentdb aws-documentdb-mongoapi


    【解决方案1】:

    编辑:更新为使用 $filter 作为 $reduce 不受 aws 文档数据库支持

    您可以使用$filter 在查找数组中只保留非 DEAD 宠物,然后计算剩余数组的大小。

    这是Mongo playground 供您参考。


    $reduce 版本

    您可以在聚合管道中使用$reduce 来获得state 的条件总和。

    这里是Mongo playground 供您参考。

    【讨论】:

    • 本来可以,但 DocumentDB 也不支持 $reduce :( 有限的支持让一切变得更加困难。docs.amazonaws.cn/en_us/documentdb/latest/developerguide/…
    • 更新答案使用$filter,AWS文档数据库应该支持这个
    • 显然 DocDB 不允许在 $project 的字段名称中使用 $expressions ($filter) - 并且看起来 $addFields 被计为 $project。这太令人沮丧了......我知道我可以从我的应用程序中执行两个查询,但我觉得数据库应该能够处理这个问题。非常感谢您的帮助 =)
    【解决方案2】:

    截至 2022 年 1 月,Amazon DocumentDB 增加了对 $reduce 的支持,上面发布的解决方案应该适合您。 Reference.

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 2017-08-27
      • 2023-03-20
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多