我有一個這樣的 mongodb 檔案
{
"_id": {
"$oid": "6241dd90891458501c17d627"
},
"A": [
{
"_id": {
"$oid": "6241ddb1891458501c17d63e"
},
"B": [
{
"_id": {
"$oid": "6241ddc4891458501c17d674"
}
},
{
"_id": {
"$oid": "6241ddda891458501c17d675"
}
}
]
},
{
"_id": {
"$oid": "6241ddbe891458501c17d63f"
},
"B": [
{
"_id": {
"$oid": "6241ddda891458501c17d678"
}
},
{
"_id": {
"$oid": "6241ddda891458501c17d679"
}
}
]
}
]
}
該檔案有 2 個嵌套陣列:一個由“A”元素組成的陣列,在“A”的每個元素內都有一個由“B”元素組成的陣列。我需要通過“B”元素的 _id 進行搜索,比如 6241ddda891458501c17d679。我需要一種在 mongodb 中獲取此結構的方法
{
"_id": {
"$oid": "6241dd90891458501c17d627"
},
"A": [
{
"_id": {
"$oid": "6241ddbe891458501c17d63f"
},
"B": [
{
"_id": {
"$oid": "6241ddda891458501c17d679"
}
}
]
}
]
}
我怎樣才能做到這一點?非常感謝
uj5u.com熱心網友回復:
也許是這樣的:
選項 1,查找:
db.collection.find({
"A.B._id": {
"$oid": "6241ddda891458501c17d679"
}
},
{
"A": {
"$filter": {
"input": {
"$map": {
"input": "$A",
"as": "a",
"in": {
"_id": "$$a._id",
"B": {
"$filter": {
"input": "$$a.B",
"as": "b",
"cond": {
"$eq": [
{
"$oid": "6241ddda891458501c17d679"
},
"$$b._id"
]
}
}
}
}
}
},
"as": "an",
"cond": {
"$ne": [
"$$an.B",
[]
]
}
}
}
})
解釋:
- 將 find() 與“AB_id”上的匹配查詢一起使用(最好在此檔案上建立索引以獲得最佳性能)
- 在過濾器部分添加 $filter/map/filter 組合以僅過濾陣列 B 元素的匹配 _id 并保留陣列 A _id ,同樣在初始過濾條件中僅使用非空陣列 [] 以避免包含來自空陣列的元素在最終結果中。
游樂場1
選項 2,聚合:
db.collection.aggregate([
{
$match: {
"A.B._id": {
"$oid": "6241ddda891458501c17d679"
}
}
},
{
"$addFields": {
"A": {
"$filter": {
"input": {
"$map": {
"input": "$A",
"as": "a",
"in": {
"_id": "$$a._id",
"B": {
"$filter": {
"input": "$$a.B",
"as": "b",
"cond": {
"$eq": [
{
"$oid": "6241ddda891458501c17d679"
},
"$$b._id"
]
}
}
}
}
}
},
"as": "an",
"cond": {
"$ne": [
"$$an.B",
[]
]
}
}
}
}
}
])
游樂場2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/453629.html
標籤:mongodb
