在 updateMany 中结合 $lookup 聚合?

Combining $lookup aggregation inside updateMany?

我收集了 用户 这样的

[
 { _id: ObjectId("61a6d586e56ea12d6b63b68e"), fullName: "Mr A" },
 { _id: ObjectId("6231a89b009d3a86c788bf39"), fullName: "Mr B" },
 { _id: ObjectId("6231a89b009d3a86c788bf3a"), fullName: "Mr C" }
]

还有这样抱怨的合集

[
 { _id: ObjectId("6231aaba2a038b39d992099b"), type: "fee", postedBy: ObjectId("61a6d586e56ea12d6b63b68e" },
 { _id: ObjectId("6231aaba2a038b39d992099b"), type: "fee", postedBy: ObjectId("6231a89b009d3a86c788bf3c" },
 { _id: ObjectId("6231aaba2a038b39d992099b"), type: "fee", postedBy: ObjectId("6231a89b009d3a86c788bf3b" },
]

我想检查 postedBy 投诉字段是否不存在于 users 中,然后使用 updateMany 查询

顺便说一句,我有一个可选的方法来实现目标,但必须使用 2 个步骤:

const complains = await Complain.aggregate()
        .lookup({
            from: "users",
            localField: "postedBy",
            foreignField: "_id",
            as: "postedBy",
        })
        .match({
            $expr: {
                $eq: [{ $size: "$postedBy" }, 0],
            },
        });
complains.forEach(async (complain) => {
        complain.type = "other";
        await complain.save();
    });

因此,我可以将 2 个步骤组合成一个 updateMany 查询吗?像 updateMany 查询中的 $match 和 $lookup?

使用 MongoDB v4.2+,您可以使用 $merge 在聚合的最后阶段执行更新。

db.complains.aggregate([
  {
    "$lookup": {
      from: "users",
      localField: "postedBy",
      foreignField: "_id",
      as: "postedByLookup"
    }
  },
  {
    $match: {
      postedByLookup: []
    }
  },
  {
    "$addFields": {
      "type": "other"
    }
  },
  {
    "$project": {
      postedByLookup: false
    }
  },
  {
    "$merge": {
      "into": "complains",
      "on": "_id",
      "whenMatched": "replace"
    }
  }
])

这里是Mongo playground供您参考。