使用 pymongo 从多个更高级别的数组对象聚合嵌套数组对象

Aggregate nested array objects from multiple higher level array objects using pymongo

基本上,我有一个包含嵌套对象数组的对象数组。我想为用户 ID 为“user1”的用户获取 front 等于“2front”的 flashcardReversed 数组对象。

这是我的数据:

[
  {
    "_id": "608642db80a36336946620aa",
    "userID": "user1",
    "title": "title2",
    "flashcardReversed": [
      {
        "_id": "608d5b290e635ece6828141X",
        "front": "2front",
        "back": "2back",
        "value": "1",
      },
      {
        "_id": "608t5b290e635ece6828141Y",
        "front": "2frontReversed",
        "back": "2backReversed"
        "value": "2",
      },
      {
        "_id": "608a5b31a3f9806de253726X",
        "front": "2front2",
        "back": "2back2"
        "value": "3",
      },
      {
        "_id": "608a5b31a3f9806de253726Y",
        "front": "2frontReversed2",
        "back": "2backReversed2"
        "value": "4",
      }
    ]
  },
  {
    "_id": "608642db80a36336946620aa",
    "userID": "user1",
    "title": "title3",
    "flashcardReversed": [
      {
        "_id": "608d5b290e635ece6828142X",
        "front": "2front",
        "back": "2back",
        "value": "12",
      },
      {
        "_id": "608t5b290e635ece6828143Y",
        "front": "2frontReversed",
        "back": "2backReversed"
        "value": "21",
      },
      {
        "_id": "608a5b31a3f9806de253727X",
        "front": "2front2",
        "back": "2back2"
        "value": "34",
      },
      {
        "_id": "608a5b31a3f9806de253729Y",
        "front": "2frontReversed2",
        "back": "2backReversed2"
        "value": "42",
      }
    ]
  },
  {
    "_id": "608642db80a36336946620aa",
    "userID": "user2",
    "title": "title4",
    "flashcardReversed": [
      {
        "_id": "608d5b290e635ece6828131X",
        "front": "2front",
        "back": "2back",
        "value": "41",
      },
      {
        "_id": "608t5b290e635ece6828161Y",
        "front": "2frontReversed",
        "back": "2backReversed"
        "value": "54",
      },
      {
        "_id": "608a5b31a3f9806de253526X",
        "front": "2front2",
        "back": "2back2"
        "value": "63",
      },
      {
        "_id": "608a5b31a3f9806de253326Y",
        "front": "2frontReversed2",
        "back": "2backReversed2"
        "value": "29",
      }
    ]
  },
]

有 2 个用户 ID 为“user1”的对象,因此输出应如下所示:

{
    "userID": "user1"
    "flashcardReversed": [
      {
        "_id": "608d5b290e635ece6828141X",
        "front": "2front",
        "back": "2back",
        "value": "1",
      },
      {
        "_id": "608d5b290e635ece6828142X",
        "front": "2front",
        "back": "2back",
        "value": "12",
      },
    ]
}

是否可以使用 pymongo 编写代码?

  • $match
  • $unwind
  • $match
  • $group
db.collection.aggregate([
  {
    "$match": {
      "userID": "user1",
      "flashcardReversed.front": "2front"
    }
  },
  {
    "$unwind": "$flashcardReversed"
  },
  {
    "$match": {
      "flashcardReversed.front": "2front"
    }
  },
  {
    "$group": {
      "_id": "$userID",
      "flashcardReversed": {
        "$push": "$$ROOT.flashcardReversed"
      }
    }
  }
])

mongoplayground

带有 fastAPI 的 pymongo

@app.get("/card")
async def root():
    db = get_database()
    pipeline = [ 
        { "$match": { "userID": "user1", "flashcardReversed.front": "2front" } }, 
        { "$unwind": "$flashcardReversed" }, 
        { "$match": { "flashcardReversed.front": "2front" } }, 
        { "$group": { "_id": "$userID", "flashcardReversed": { "$push": "$$ROOT.flashcardReversed" } } } 
    ]
    c = list(db['card'].aggregate(pipeline))
    return {"message": c}