【问题标题】:How to use two MongoDB aggregations to perform an updateMany如何使用两个 MongoDB 聚合来执行 updateMany
【发布时间】:2021-08-01 16:41:09
【问题描述】:

我正在尝试编写一个脚本,它使用 2 个聚合并将结果保存为一个数组以用于 updateMany

第一个 aggregate 查找包含 firstTrackingIdsecondTrackingId 的任何文档。我把它保存到一个数组中。此聚合在单独测试时工作正常。

第二个aggregate 将使用第一个聚合的结果数组,从第一个聚合的结果中提取所有具有firstTrackingId 的文档。这将拉出所有没有secondTrackingId 的文档,并将唯一的mongo _id/ObjectId 保存到一个数组中。

updateMany 将使用来自第二个聚合的所有结果来更新所有状态为 void 的相关文档。

当我给它们提供硬编码数据时,所有这些函数都可以工作,但我不知道如何从数组中提取数据。我什至不确定我是否正确地“保存”了它,或者除了将聚合初始化为数组之外我还应该做些什么。

var ids = db.getCollection('Test').aggregate([
    {
        $match: {
            "firstTrackingId": { "$ne": "" },
            "secondTrackingId": { "$exists": true }
        }
    },
    {
        $group: {
            _id: "$firstTrackingId",
        }
    },
])


var secondIds = db.getCollection('Test').aggregate([
    {
        $match: {
            "firstTrackingId": { $in: ids },
            "secondTrackingId": { $exists: false }
        }
    },
    {
        $group: {
            "_id": "$_id",
        }
    },
])


db.getCollection('Test').updateMany({
    "_id": {
        "$in": secondIds
    },
}, { $set: {
        "status": "VOID"
    } })

我尝试将第一个聚合的结果打印出来...无法真正弄清楚如何...所以如果我这样做了第一个:

print(ids.next(ids._id))

我明白了:

[object BSON]

这让我相信我需要以某种方式执行$objectToArray。如果有人有任何见解,那就太棒了。谢谢!

【问题讨论】:

    标签: mongodb aggregate


    【解决方案1】:

    如果您使用的是 MongoDB 4.4+,则可以使用单个聚合管道来完成:

    • 将文档与第一个和第二个跟踪 ID 匹配
    • 查找具有相同第一个跟踪 ID 的所有文档的数组
    • 展开数组
    • 将数组元素视为根文档
    • 匹配以消除具有第二个跟踪 ID 的任何内容
    • 设置所需的状态字段
    • merge结果与原合集
    {$match: {
              firstTrackingId: { $ne: "" },
              secondTrackingId: { $exists: true }
    }},
    {$lookup:{
        from: "Test",
        localField:"firstTrackingId",
        foreignField:"firstTrackingId",
        as:"matched"
    }},
    {$unwind:"$matched"},
    {$replaceRoot:{newRoot:"$matched"}},
    {$match:{secondTrackingId:{"$exists":false}}},
    {$addFields:{status:"VOID"}},
    {$merge: {into: "Test"}}
    

    【讨论】:

    • 您好,非常感谢! $lookup 是我研究过的东西,但一直在努力弄清楚如何让它在同一个集合中工作——我想我只是像往常一样想多了。这对我来说非常有用!我取出 {$merge: "Test"} 因为它给了我以下错误:预计文档类型的值是意外类型的字符串。不过,如果没有 {$merge: "Test" 行,它似乎工作得很好。再次感谢您!
    • 是的,那是错误的语法,现在更正了。使用 $merge 阶段,您无需单独运行更新
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多