[英]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
}
}
])
上述管道的解釋:
$unwind
將數組划分為其元素$project
和$map
將flashcardReversed
object 轉換為值數組。 使用$map
允許管道處理正常和反轉之上的任何其他鍵$unwind
再次拆分步驟 2 中形成的 flashcardReversed 數組$group
和$push
累加器將flashcardReversed
的所有值添加到單個數組中$project
從響應中刪除_id
字段這是相同的 Mongodb 游樂場鏈接
這可以通過
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.