Mongodb 在记录上使用$unwind后仅与一条记录匹配
我有如下记录Mongodb 在记录上使用$unwind后仅与一条记录匹配,mongodb,aggregation-framework,aggregation,Mongodb,Aggregation Framework,Aggregation,我有如下记录 [ { _id : 1, nm : 1, usr:[ {id : 1, ty : 'team'}, {id : 2, em : 'a'}, {id : 3, em : 'b'} ] }, { _id : 2, nm : 2, usr:[ {id : 2, em : 'a'}, {id : 3, em : 'b'} ]
[
{
_id : 1, nm : 1,
usr:[
{id : 1, ty : 'team'},
{id : 2, em : 'a'},
{id : 3, em : 'b'}
]
},
{
_id : 2, nm : 2,
usr:[
{id : 2, em : 'a'},
{id : 3, em : 'b'}
]
},
{
_id : 3, nm : 3,
usr:[
{id : 1, ty : 'team'},
{id : 3, em : 'b'}
]
},
{
_id : 4, nm : 4,
usr:[
{id : 3, em : 'b'}
]
}
]
当使用userAndTeam=[1,2]进行查询时,我希望计数为3,即如果记录的usr.id为1或2,则获取这些记录。
当使用userAndTeam4=[1,4]进行查询时,我希望计数为2,即如果记录的usr.id为1或4,则获取这些记录。
我尝试使用$unwind,第一个案例的计数为4,因为$unwind为第一个记录创建了3条记录,下面的查询与其中2条记录匹配
我尝试过的查询:
var userAndTeam = [1, 2] //User id and team id. Record should match one of the ids.
var userAndTeam4 = [1, 4]
[{
$unwind: '$usr'
},
{
$project:{
'count-2' : {$cond: {
if: {$in : ['$usr.id',userAndTeam]},
then: 1,
else: 0
}},
'count-4' : {$cond: {
if: {$in : ['$usr.id',userAndTeam4]},
then: 1,
else: 0
}}
}
}
]
输出:
id为2-“count-2”的用户应为:3
已为id为2-“count-2”的用户获取:4
id为4-“count-4”的用户应为:2
已为id为4-“count-4”的用户获取:2
有人能指导我解决这个问题并获得预期的计数吗?您可以尝试以下方法:
db.col.aggregate([
{
$unwind: "$usr"
},
{
$project:{
"userId": "$usr.id",
"count-2": {
$cond: {
if: { $in: [ "$usr.id", userAndTeam ] },
then: 1,
else: 0
}
},
"count-4": {
$cond: {
if: { $in: [ "$usr.id", userAndTeam4] },
then: 1,
else: 0
}
}
}
},
{
$group: {
_id: "$_id",
"count-2": { $max: "$count-2" },
"count-4": { $max: "$count-4" }
}
},
{
$group: {
_id: null,
"count-2": { $sum: "$count-2" },
"count-4": { $sum: "$count-4" }
}
}
])
您的代码中缺少的是,您希望每个_id都有0或1,因此您需要按_id对每个组进行分组,如果任何元素与数组不匹配,则每个组的$max值为0。您可能需要查看I have records,如下所示:,由于您不太清楚如何从提供的数据集中获得id为4的用户是id为1的团队的一部分。@AlexBlex请现在检查问题。我希望我的问题和要求现在更清楚了。