簡體   English   中英

MongoDB 聚合查詢 - 返回嵌套子文檔中的所有項目

[英]MongoDB aggregation query - return all items inside nested subdocument

基本上,我有一個嵌套的對象數組。 我想從這些對象中提取信息,並將所有結果作為數組返回。

這是我的數據:

[
  {
    "_id": "608642db80a36336946620aa",
    "title": "titleHere",
    "types": {
      "flashcardReversed": [
        {
          "normal": { // the data inside of "normal" should become its own object in the returned array
            "_id": "608d5b290e635ece6828141X",
            "front": "2front",
            "back": "2back"
          },
          "reversed": { // the data inside of "reversed" should become its own object in the returned array
            "_id": "608t5b290e635ece6828141Y",
            "front": "2frontReversed",
            "back": "2backReversed"
          }
        },
        {
          "normal": {
            "_id": "608a5b31a3f9806de253726X",
            "front": "2front2",
            "back": "2back2"
          },
          "reversed": {
            "_id": "608a5b31a3f9806de253726Y",
            "front": "2frontReversed2",
            "back": "2backReversed2"
          }
        }
      ]
    }
  }
]

這是期望的結果:

[
  {
    "flashcardReversed": [
      {
        "_id": "608d5b290e635ece6828141X",
        "front": "2front",
        "back": "2back"
      },
      {
        "_id": "608t5b290e635ece6828141Y",
        "front": "2frontReversed",
        "back": "2backReversed"
      },
      {
        "_id": "608t5b290e635ece6828141Y",
        "front": "2frontReversed",
        "back": "2backReversed"
      },
      {
        "_id": "608a5b31a3f9806de253726Y",
        "front": "2frontReversed2",
        "back": "2backReversed2"
      }
    ]
  }
]

我當前的嘗試: https://mongoplayground.net/p/k3Fjd59KMKg我嘗試通過各種方法合並$card$card2文檔,然后使用$replaceRoot創建所需的結果 - 但經過長時間的嘗試,我沒有成功.

關於我的用例的一些注意事項 - 我將在$facet中使用這個管道 在flashcardReversed中將有許多對象,它們都是從相同的 Mongoose Schema 創建的

該文檔最多應包含約 2000 張卡片。 我需要在反應網站中使用的結果。 我應該擔心這個搜索的效率嗎? (如果這本身就是一個問題,我很樂意移動它)。

如果我的 ZCCADCDEDB567ABAE643E15DCF0974E503Z 架構有幫助,請告訴我,我可以添加它們。

感謝所有幫助,

- Riley Swinson

我能夠想出這個查詢來得到想要的結果

    db.collection.aggregate([
  {
    "$unwind": "$types.flashcardReversed"
  },
  {
    "$project": {
      "flashcardReversed": {
        "$map": {
          "input": {
            "$objectToArray": "$types.flashcardReversed"
          },
          "as": "elem",
          "in": "$$elem.v"
        }
      }
    }
  },
  {
    "$unwind": "$flashcardReversed"
  },
  {
    "$group": {
      "_id": 1,
      "flashcardReversed": {
        "$push": "$flashcardReversed"
      }
    }
  },
  {
    "$project": {
      "_id": 0
    }
  }
])

上述管道的解釋:

  1. 使用$unwind將數組划分為其元素
  2. 使用$project$mapflashcardReversed object 轉換為值數組。 使用$map允許管道處理正常和反轉之上的任何其他鍵
  3. 使用$unwind再次拆分步驟 2 中形成的 flashcardReversed 數組
  4. 使用$group$push累加器將flashcardReversed的所有值添加到單個數組中
  5. 使用$project從響應中刪除_id字段

這是相同的 Mongodb 游樂場鏈接

這可以通過

  • $unwind 拆分 flash 卡陣列
  • $project 將包含正常/反向的 object 轉換為數組
  • $unwind 創建的數組
  • $group by _id 並收集數組中的值
db.collection.aggregate([
  {$unwind: "$types.flashcardReversed"},
  {$project: {
      flashcardReversed: [
        "$types.flashcardReversed.normal",
        "$types.flashcardReversed.reversed"
      ]
  }},
  {$unwind: "$flashcardReversed"},
  {$group: {
      _id: "$_id",
      flashcardReversed: {$push: "$flashcardReversed"}
  }}
])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM