我有以下“用户”集合的文档,其中包含两个嵌套数组:
{
"person" : {
"personId" : 78,
"firstName" : "Mario",
"surname1" : "LOPEZ",
"surname2" : "SEGOVIA"
},
"accounts" : [
{
"accountId" : 42,
"accountRegisterDate" : "2018-01-04",
"banks" : [
{
"bankId" : 1,
"name" : "Bank LTD",
},
{
"bankId" : 2,
"name" : "Bank 2 Corp",
}
]
},
{
"accountId" : 43,
"accountRegisterDate" : "2018-01-04",
"banks" : [
{
"bankId" : 3,
"name" : "Another Bank",
},
{
"bankId" : 4,
"name" : "BCT bank",
}
]
}
]
}
我正在尝试获取一个查询,该查询将找到此文档并仅在输出中获得此子文档:
{
"bankId" : 3,
"name" : "Another Bank",
}
我真的被卡住了。如果我运行此查询:
{ "accounts.banks.bankId": "3" }
获取整个文档。而且我尝试了投影的组合但没有成功:
{"accounts.banks.0.$": 1} //returns two elements of array "banks"
{"accounts.banks.0": 1} //empty bank array
也许这不是查询此问题的方法,而我的方向很糟糕。
你能帮我么?
您可以尝试以下解决方案:
db.user.aggregate([
{ $unwind: "$accounts" },
{ $match: { "accounts.banks.bankId": 3 } },
{
$project: {
items: {
$filter: {
input: "$accounts.banks",
as: "bank",
cond: { $eq: [ "$$bank.bankId", 3 ] }
}
}
}
},
{
$replaceRoot : {
newRoot: { $arrayElemAt: [ "$items", 0 ] }
}
}
])
为了能够过滤帐户,bankId
您需要将其$ unwind。然后,您可以将帐户匹配到bankId
等于的帐户3
。由于banks
是另一个嵌套数组,因此可以使用$ filter运算符对其进行过滤。这将为您提供一个嵌套在items数组中的元素。要摆脱嵌套,可以将$ replaceRoot与$ arrayElemAt一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句