我需要在不使用$ unwind的情况下获得字段值 因为$ unwind和$ group需要更长的时间。
我的文件(看起来像):
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"providers" : [
{
"list" : [
{
"code" : "ATT",
"descr" : "Attending"
}
],
"Name" : "John Doe",
"prvdId" : "1"
},
{
"list" : [
{
"code" : "RFR",
"descr" : "Referring"
},
{
"code" : "TRT",
"descr" : "Treating"
}
],
"Name" : "Smith William",
"prvdId" : "2"
}
]
}
cond is if" code" :" TRT",而不是" prvdId"
预期结果是
{"prvdId" : "2"}
答案 0 :(得分:0)
将$filter
与$ in一起使用以查找嵌套数组中的匹配项,然后使用$let
查找$arrayElemAt
以在3.4中输出prvdId。
db.col.aggregate([
{"$match":{"providers.list.code":"TRT"}},
{"$project":{
"_id":0,
"prvdId":{
"$let":{
"vars":{
"providersl":{
"$filter":{
"input":"$providers",
"as":"providerf",
"cond":{"$in":["TRT","$$providerf.list.code"]}
}
}
},
"in":{"$arrayElemAt":["$$providersl.prvdId",0]}
}
}
}}
])
答案 1 :(得分:0)
根据上述描述作为解决方案,可以通过使用$ elemMatch运算符将数组元素搜索到查找操作中来获得预期结果。
db.collection.find({
providers: {
$elemMatch: {
list: {
$elemMatch: {
code: "TRT"
}
}
}
}
}, {
'providers.$.prvdId': 1
})