用于嵌套数组元素的 mongodb $group

标签 mongodb aggregate

对于给定的问题,我有以下 mongodb 集合(questionanswers)

{ 
"_id" : { "$oid" : "59cda8b730a0131cfafc9101" }, 
"questionId" : { "$oid" : "59cb7b85c854036fec173267" }, 
"userQuestionAnswerDetails" : [ { "srno" : 1, "correct_yn" : false}, { 
 "srno" : 2, "correct_yn" : false} ] 
}

{ 
"_id" : { "$oid" : "59cdb1b930a0131cfafc9102" }, 
"questionId" : { "$oid" : "59cb7b85c854036fec173267" }, 
"userQuestionAnswerDetails" : [ { "srno" : 2, "correct_yn" : false} ] 
}

{ 
"_id" : { "$oid" : "59cdbb1b30a0131cfafc9105" }, 
"questionId" : { "$oid" : "59cb7b85c854036fec173267" }, 
"userQuestionAnswerDetails" : [ { "srno" : 2, "correct_yn" : false} ] 
}

{ 
"_id" : { "$oid" : "59cdd26a30a0131cfafc9107" }, 
"questionId" : { "$oid" : "59cb7b85c854036fec173267" }, 
"userQuestionAnswerDetails" : [ { "srno" : 1, "correct_yn" : false} ] 
}

我需要每个 sr no 的 cnt,它位于嵌套数组元素中。 预期是:

Srno ===> cnt

1 ===> 2

2 ===> 3

我正在尝试以下查询

db.questionanswers.aggregate([
{
    $match:{
        $and: [
            {questionId: ObjectId("59cb7b85c854036fec173267")}
        ]       
    }
},
{
    $group : {_id : {questionId:"$questionId", userQuestionAnswerDetails: "$userQuestionAnswerDetails.srno"}, num_tutorial : {$sum : 1}}
}
])

上面的查询给了我类似于下面的东西:

{"_id": {"questionId":"ObjectId(59cb7b85c854036fec173267)", "userQuestionAnswerDetails":[1,2]},"num_tutorial":1}
 {"_id":{"questionId":"ObjectId(59cb7b85c854036fec173267)", "userQuestionAnswerDetails":[1]},"num_tutorial":1}
{"_id":{"questionId":"ObjectId(59cb7b85c854036fec173267)", "userQuestionAnswerDetails":[2]},"num_tutorial":2} 

相当于 Srno ===> Cnt

1,2 ===> 1

1 ===> 1

2 ===> 2

如何修改 $group 以达到预期的结果?提前致谢。

最佳答案

您可以通过添加 $unwind 阶段来实现。

db.questionanswers.aggregate([
{
    $match:{
        $and: [
            {questionId: ObjectId("59cb7b85c854036fec173267")}
        ]       
    }
}
,{
    $unwind: "$userQuestionAnswerDetails" 
}
,{
    $group : {_id :  {questionId:"$questionId", userQuestionAnswerDetails: "$userQuestionAnswerDetails.srno"}, num_tutorial : {$sum : 1}}
}
])

结果:

{ "_id" : { "questionId" : ObjectId("59cb7b85c854036fec173267"), "userQuestionAnswerDetails" : 2 }, "num_tutorial" : 3 }
{ "_id" : { "questionId" : ObjectId("59cb7b85c854036fec173267"), "userQuestionAnswerDetails" : 1 }, "num_tutorial" : 2 }

关于用于嵌套数组元素的 mongodb $group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537807/

相关文章:

用于选择嵌入对象的 Mongodb 查询

java - Mongodb池连接错误

javascript - 聚合一个对象,其中每个键的值都是对象数组

r - R 中按 GroupID 分组的值出现次数

r - 将 POLYGON 聚合为 MULTIPOLYGON 并保留 data.frame

c# mongodb 批量插入

scala - MongoDB - 匿名化 600k 记录

r - 根据组过滤多个出现的情况

r - 如何根据每个ID汇总R中的表

MongoDB - 将数组拆分为多个文档并用数组对象替换现有文档