我有大量 JSON 檔案,其中包含以下格式的許多條目(我的示例中的內容對我的問題很重要):
doc1
{
"data": [{
"entry": {
"fieldA": "aaa",
"fieldB": "xxx"
}
},
{
"entry": {
"fieldA": "ccc",
"fieldB": "yyy"
}
},
{
"entry": {
"fieldA": "eee",
"fieldB": "xxx"
}
}
]
}
doc2
{
"data": [{
"entry": {
"fieldA": "aaa",
"fieldB": "xxx"
}
},
{
"entry": {
"fieldA": "ccc",
"fieldB": "yyy"
}
},
{
"entry": {
"fieldA": "eee",
"fieldB": "nnn"
}
}
]
}
...
docN
{
"data": [{
"entry": {
"fieldA": "aaa",
"fieldB": "yyy"
}
},
{
"entry": {
"fieldA": "ccc",
"fieldB": "yyy"
}
},
{
"entry": {
"fieldA": "eee",
"fieldB": "xxx"
}
}
]
}
我想要做的是創建一個遵循以下規則的查詢:
僅回傳具有包含的檔案,并且具有包含fieldA的aaa另一個條目,并且這些條目中的 具有匹配的值。fieldAeeefieldB
在上面的示例中,這將是第一個頂級檔案,fieldB因為兩個子條目都是xxx
此外,最好只修剪回傳檔案中的條目,而不是整個檔案
uj5u.com熱心網友回復:
無需展開和再次分組的一種選擇是:
- 按要求清理您的資料。
$match只想要檔案
db.collection.aggregate([
{$project: {
data: {$filter: {
input: "$data",
cond: {$or: [
{$eq: ["$$this.entry.fieldA", "aaa"]},
{$eq: ["$$this.entry.fieldA", "eee"]}
]}
}}
}},
{$match: {
$expr: {$and: [
{$eq: [{$size: "$data"}, 2]},
{$eq: [{$first: "$data.entry.fieldB"}, {$last: "$data.entry.fieldB"}]}
]}
}}
])
看看它在操場上的例子是如何作業的
uj5u.com熱心網友回復:
我 hpoe 這將按您的預期回傳
https://mongoplayground.net/p/OcPAJ2FoQXi
[{
$unwind: {
path: '$data'
}
}, {
$match: {
$or: [
{
'data.entry.fieldA': 'aaa'
},
{
'data.entry.fieldA': 'eee'
}
]
}
}, {
$group: {
_id: '$_id',
data: {
$push: {
fieldA: '$data.entry.fieldA',
fieldB: '$data.entry.fieldB'
}
}
}
}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519950.html
下一篇:檢查一個鍵是否存在并回傳另一個鍵
