我的檔案中有一個特定的欄位,它具有多級嵌套陣列結構。該檔案看起來像這樣
{
"_id" : ObjectId("62171b4207476091a17f595f"),
"data" : [
{
"id" : "1",
"content" : [
{
"id" : "1.1",
"content" : []
},
{
"id" : "1.2",
"content" : [
{
"id" : "1.2.1",
"content" : [
{
"id" : "1.2.1.1",
"content" : []
}
]
},
{
"id" : "1.2.2",
"content" : []
}
]
}
]
}
]
}
(我的實際資料中的 id 是一個隨機字串,我在這里添加了一個更定義的 id 只是為了便于閱讀)
在我的應用程式代碼中,嵌套級別受到控制,因此它不會超過 5 級。
我需要在一個深度嵌套的陣列中投影一個特定的物件。
我擁有遍歷嵌套結構所需的所有資訊。例如,如果我需要獲取 id 為“1.2.2”的物件,我的輸入將如下所示:
[{id: 1, index: 0}, {id: 1.2, index: 1}, {id: 1.2.2, index: 1}]
在上面的陣列中,每個元素代表一層嵌套。我有 ID 和索引。所以在上面的例子中,我知道我首先需要到達頂層的索引 0 ,然后在里面到索引 1 ,然后在里面再到索引 1 來找到我的物件。
有沒有辦法只能使用查詢直接獲取我想要的內部物件。或者我是否需要獲取整個“資料”欄位并在我的應用程式代碼中進行遍歷。我一直無法想出任何方法來構建滿足我需要的查詢。
uj5u.com熱心網友回復:
詢問
- 如果您知道路徑,則可以使用一系列嵌套
$getField$arrayElemAt
- 你可以在一個階段使用嵌套呼叫,或者像我下面做的那樣使用許多新欄位,或者使用 mongodb 變數
*我不確定你需要什么輸出,這進入使用索引獲取 2(如果這不是你需要添加的,如果你可以預期的輸出)
測驗代碼在這里
資料
[
{
"_id": ObjectId( "62171b4207476091a17f595f"),
"data": [
{
"id": "1",
"content": [
{
"id": "1.1",
"content": []
},
{
"id": "1.2",
"content": [
{
"id": "1.2.1",
"content": [
{
"id": "1.2.1.1",
"content": []
}
]
},
{
"id": "1.2.2",
"content": [1,2]
}
]
}
]
}
]
}
]
詢問
aggregate(
[{"$set":
{"c1":
{"$getField":
{"field":"content", "input":{"$arrayElemAt":["$data", 0]}}}}},
{"$set":
{"c2":
{"$getField":
{"field":"content", "input":{"$arrayElemAt":["$c1", 1]}}}}},
{"$set":
{"c3":
{"$getField":
{"field":"content", "input":{"$arrayElemAt":["$c2", 1]}}}}},
{"$project":{"_id":0, "c4":{"$arrayElemAt":["$c3", 1]}}}])
結果
[{
"c4": 2
}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432876.html
