Home > Mobile >  Combining $lookup aggregation inside updateMany?
Combining $lookup aggregation inside updateMany?

Time:04-26

I have a collection of users like this

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

And a collection of complains like this

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

I want to check if the postedBy fields of complains are not existed in users, then update by using the updateMany query

By the way, I have an optional way to achieve the goal but must use 2 steps:

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();
    });

Therefore, can I combine 2 steps into a single updateMany query? Like $match and $lookup inside updateMany query?

CodePudding user response:

With MongoDB v4.2 , you can use $merge to perform update at last stage of aggregation.

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"
    }
  }
])

Here is the Mongo playground for your reference.

  • Related