我在Mongo DB中有一个集合,它看起来像这样 -
const clientsColection = {
"_id" : ObjectId("5ec8492c27ecdc17362b86cb"),
"clientName" : "data" ,
"users" : [
{
"roles" : [],
"operations" : [],
"_id" : ObjectId("5ecac60ab527bd0ba4a615cf"),
"isAdmin" : false,
"username" : "Adduser"
},
{
"roles" : [],
"operations" : [],
"_id" : ObjectId("5ecac60ab527bd0ba4a616cf"),
"isAdmin" : false,
"username" : "new"
}
],
"kpiObj" : [
{
"kpiName" : "epsilon",
"resultObj" : {
"result" : [
{
"mark" : 4,
"plz" : "01069"
},
{
"mark" : 5,
"plz" : "01067"
}
],
}
},
{
"kpiName" : "epsilon2",
"resultObj" : {
"result" : [
{
"mark" : 3,
"plz" : "01069"
},
{
"mark" : 1,
"plz" : "01067"
}
],
}
}
]
}
我正在尝试使用aggregate
,project
,filter
操作符对嵌套对象数组执行过滤,但是我还没有成功获得期望的输出。
我想要实现以下内容:
- 阶段1:匹配
users.username
的users
数组对象,并检索匹配的对象数组(始终只有1个)。 - 阶段2:将从阶段1输出与
kpiObj
中的kpiName
匹配,并检索匹配的对象数组(始终只有1个)。 - 阶段3:将从阶段2输出与
resultObj
中的mark
匹配,并检索匹配的对象数组。
我已经花了过去3天时间观看了几个教程并查看了几个stackoverflow问题,但是还没有能够获得期望的输出。我已经使用以下查询语句获得了阶段1的期望输出。希望能得到任何帮助。
db.getCollection("clientsCollection").aggregate([
{ $match: { 'users.username': 'Adduser' } },
{
$project: {
users: {
$filter: {
input: '$users',
as: 'user',
cond: { $eq: ['$$user.username', 'Adduser'] }
}
}, 'kpiObj.kpiName':1, 'kpiObj.resultObj.result.score':1 , 'kpiObj.resultObj.result.plz':1
}
}
])
输出*
对于匹配username
为Adduser
,kpiObj.kpiName
为epsilon
,以及kpiObj.resultObj.result.mark
为4,我期望得到以下输出:-
const clientsColection = {
"_id" : ObjectId("5ec8492c27ecdc17362b86cb"),
"clientName" : "data" ,
"users" : [
{
"username" : "Adduser"
}
],
"kpiObj" : [
{
"kpiName" : "epsilon",
"resultObj" : {
"result" : [
{
"mark" : 4,
"plz" : "01069"
}
],
}
}
]
}
kpiName
?你想要得到什么样的输出文档? - Joe