如何在数组中查找元素并仅使用$project返回这些元素



我有如下文件:

{
"_id" : ObjectId("999999b64655dea5e296de31b00"),
"companies" : [ 
{
"companyId" : "ABC",

"range" : {
"start" : 0,
"end" : 30
}
}, 
{
"companyId" : "DEF",
"range" : {
"start" : 20,
"end" : 30
}
}, 
{
"companyId" : "CGH",
"range" : {
"start" : 40,
"end" : 50
}
}, 
{
"companyId" : "ABC",

"range" : {
"start" : 60,
"end" : 90
}
}, 

],
"createdTs" : NumberLong(1612407909406),
"updatedTs" : NumberLong(1620891030125)
}

如何查找"companyId" : "ABC"并仅使用$project返回这些元素?

我可以使用返回列表

db.getCollection('companyDetails').aggregate([
{$match: {"companies.companyId": "ABC"}}, 
{$project: {
list: {$filter: {
input: "$companies",
as: "item",                     
cond: {$eq:['$$item.companyId', 'ABC']}
}}
}}
]);

输出:

{
"_id" : ObjectId("999999b64655dea5e296de31b00"),
"list" : [ 
{
"companyId" : "ABC",            
"range" : {
"start" : 0,
"end" : 30
}
}, 
{
"companyId" : "ABC",           
"range" : {
"start" : 60,
"end" : 90
}
}
]
}

但是。我只需要范围列表,而不是整个块

示例:预期

{
"_id" : ObjectId("999999b64655dea5e296de31b00"),
"list" : [ 
"range" : {
"start" : 0,
"end" : 30
}, 
"range" : {
"start" : 60,
"end" : 90
}
]
}
  • $filter迭代companies的循环并通过companyId进行过滤
  • $project阶段仅选择range字段
db.collection.aggregate([
{ $match: { "companies.companyId": "ABC" } },
{
$project: {
list: {
$filter: {
input: "$companies",
cond: { $eq: ["$$this.companyId", "ABC"] }
}
}
}
},
{ $project: { "list.range": 1 } }
])

游乐场

最新更新