我有如下文件:
{
"_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 } }
])
游乐场