在 MongoDB 中,我有具有以下結構的檔案:
{
"_id": {
"$oid": "570794ee453b02a0001000001"
},
"fields_data": {
"572999c241f1590001000005": "Chicago",
"572999c241f1590001000007": "Male",
"572999c241f1590001000013": "Dr.",
"57299c0741f1590001000023": null,
"572999c241f1590001000017": "",
"589886d48570e90001000111": true,
"58762ac58570e9000100006a": true
}
}
fields_data物件非常動態;物件的<field>不是靜態的。
是否可以僅搜索或過濾fields_data物件的值?
就像是:
$filter: {
input: "$fields_data",
as: "field",
cond: { $eq: [ "$$field.???", "Male" ] }
}
我正在使用 MongoDB 5.0.4 社區
編輯/解決方案:
感謝您的回復和幫助。以下對我有用。
<used within node>
[
{
'$project': {
'array': {
'$objectToArray': '$fields_data'
},
'doc': '$$ROOT'
}
}, {
'$match': {
'array.v': 'Male'
}
}, {
'$replaceRoot': {
'newRoot': '$doc'
}
}
]
uj5u.com熱心網友回復:
我認為這是您尋找的答案, 基本上您可以使用 $where。我也同意您可能會重新考慮讓您的 fields_data 成為具有“名稱”和“值”欄位的物件陣列的評論,這樣您就可以進行直接的正常查詢。
uj5u.com熱心網友回復:
詢問
- 我們不能動態構造路徑,所以唯一的方法是將物件轉換為陣列和過濾器。
objectToArray將嵌入的檔案轉換為表單中的陣列
[{"k" : "key1", "v" : "value1"} ....]filter并且只有在"value"="Male"arrayToObject像原來一樣轉換回物件
*我認為您應該更改架構,欄位用于架構,而不是一般用于保存資料,如果您這樣做,查詢會變得更加復雜和緩慢
測驗代碼在這里
aggregate(
[{"$set":
{"fields_data":
{"$filter":
{"input":{"$objectToArray":"$fields_data"},
"cond":{"$eq":["$$this.v", "Male"]}}}}},
{"$set":{"fields_data":{"$arrayToObject":["$fields_data"]}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/410182.html
標籤:
