如何使用两个 MongoDB 聚合来执行 updateMany

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

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

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

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

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

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。如果有人有任何见解,那就太棒了。谢谢!

webkate4747 回答:如何使用两个 MongoDB 聚合来执行 updateMany

如果您使用的是 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"}}
本文链接:https://www.f2er.com/1276.html

大家都在问