mongodb 是否可以聚合从“查找和更新”返回的文档?

42fyovps  于 2023-03-17  发布在  Go
关注(0)|答案(1)|浏览(120)

假设我有以下两个集合:

学生

{
  "_id": "1234",
  "name": "Theodo"
}

卡片

{
  "student_id": "1234",
  "given_date": "11.10.2019"
}

然后我需要像这样更新学生的信息

db.students.find_one_and_update({"_id": "1234"}, {"$set":{"name": "Matt"}}, return_document=ReturnDocument.AFTER)

这很酷,它返回这个;

[
    {
      "_id": "1234",
      "name": "Matt"
    }
]

但是想象一下UI需要这样的信息;

[
  {
    "_id": "1234",
    "card_given_date": "11.10.2019",
    "name": "Matt"
  }
]

所以我需要用聚合来检索它;

db.students.aggregate([
  {
    "$lookup": {
      "from": "cards",
      "localField": "_id",
      "foreignField": "student_id",
      "as": "student_card"
    }
  },
  {
    "$unwind": "$student_card"
  },
  {
    "$set": {
      "card_given_date": "$student_card.given_date"
    }
  },
  {
    "$unset": "student_card"
  }
])

我的问题是我必须更新,然后用聚合检索它。如果我可以在update操作后获得文档,我可以做些什么来聚合返回的文档,以便摆脱第二个retrieve操作吗?

0s0u357o

0s0u357o1#

原则上,如果运行MongoDB版本〉5.1,就可以做到这一点

let newDoc = db.students.findOneAndUpdate(
   { _id: "1234" },
   { $set: { "name": "Matt" } },
   { returnNewDocument: true }
)

db.aggregate([
   { $documents: [newDoc] },
   {
      $lookup: {
         from: "cards",
         localField: "_id",
         foreignField: "student_id",
         as: "student_card"
      }
   },
   { $unwind: "$student_card" },
   {
      $set: {
         card_given_date: "$student_card.given_date",
         student_card: "$$REMOVE"
      }
   }
])

但是我不知道python是否支持db.aggregate([ { $documents: ... } ])

相关问题