我有以下檔案。需要注意的是頂級檔案具有ID和attribute1與通用subDocument。
{
"ID": "1",
"attribute1": "123",
"subDocument": [
{
"ID": "2",
"attribute1": "456",
},
{
"ID": "3",
"attribute1": "567",
}
]
},
{
"ID": "4",
"attribute1": "123",
"subDocument": [
{
"ID": "5",
"attribute1": "456",
}
]
}
現在我需要一個可以基于ID和進行搜索的查詢attribute1。如果我給ID=1, attribute1="123",它應該回傳第一個頂級檔案,如下所示:
{
"ID": "1",
"attribute1": "123"
}
如果我給ID=2, attribute1="456",它應該回傳 subDocument 的專案,如下所示:
{
"ID": "2",
"attribute1": "456",
}
我怎樣才能做到這一點? 操場
uj5u.com熱心網友回復:
您可以使用 來創建根檔案和子檔案的聯合$unionWith。然后對聯合結果應用您的過濾器。
db.collection.aggregate([
{
$project: {
"ID": 1,
"attribute1": 1
}
},
{
"$unionWith": {
"coll": "collection",
"pipeline": [
{
"$unwind": "$subDocument"
},
{
"$replaceRoot": {
"newRoot": "$subDocument"
}
}
]
}
},
{
$match: {
// your criteria here
"ID": "2",
"attribute1": "456",
}
}
])
這是Mongo 游樂場供您參考。
uj5u.com熱心網友回復:
詢問
- 添加根的 id/attribute 作為子檔案
- 展開并替換
ROOT=> 每個成員成為 ROOT 檔案 $match將檔案與變數匹配
測驗代碼在這里
aggregate(
[{"$project":
{"subDocument":
{"$concatArrays":
["$subDocument", [{"ID": "$ID", "attribute1": "$attribute1"}]]}}},
{"$unwind": {"path": "$subDocument"}},
{"$replaceRoot": {"newRoot": "$subDocument"}},
{"$match" : {"ID" : your_id_var , "attribute1" : your_attr_var}}])
uj5u.com熱心網友回復:
我們知道為什么架構是這樣的,您將 ID 和屬性 1 放在檔案級別和子檔案級別嗎?盡管我們使用此架構,但您需要回傳的檔案與您在 Query 中傳遞的過濾器值相同?檔案 ID 和子檔案 ID 是否有可能發生沖突?
您仍然希望通過以下任何方式獲得此結果:
如果您想根據匹配保留檔案和子檔案,請使用:https : //mongoplayground.net/p/e0PaEvZhXIf或https://mongoplayground.net/p/d8IKfSW4h87
但是,現在您只需要匹配的任何內容,然后在https://mongoplayground.net/p/Ww1WqmY6wrV下方使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/338560.html
標籤:mongodb
上一篇:我直接從控制面板卸載了mongodb,現在如何徹底卸載?
下一篇:類別和子類別架構設計
