我对使用MongoDB查询还很陌生。
我想数一数根据问题选出的答案的数量。
以下是我正在尝试处理的数据的示例:
{
"_id": "910ef391-bc06-4fda-80c5-c6a6d9bcXXXX",
"book": {
"register": [
{
"questions": [
{
"id": "87b8c60c-9c9e-41d1-a52a-588400deXXXX",
"name": "Question A",
"answers": [
{
"_id": 1,
"label": "Answer 1",
"selected": true
},
{
"_id": 2,
"label": "Answer 2",
"selected": false
}
]
},
{
"id": "55b8c60c-9c9e-41d1-a52a-588400deXXXX",
"name": "Question B",
"answers": [
{
"_id": 1,
"label": "Answer 1",
"selected": true
},
{
"_id": 2,
"label": "Answer 2",
"selected": false
}
]
}
]
}
]
}
},
{
"_id": "120ef391-bc06-4fda-80c5-c6a6d9bcXXXX",
"book": {
"register": [
{
"questions": [
{
"id": "99b8c60c-9c9e-41d1-a52a-588400deXXXX",
"name": "Question A",
"answers": [
{
"_id": 1,
"label": "Answer 1",
"selected": true
},
{
"_id": 2,
"label": "Answer 2",
"selected": false
}
]
}
]
}
]
}
}
]
以下是预期结果:
[
{
"Answer 1": 2
}
]
我想数一数问题A的精选答案的数目。
我尝试了一些方法,但没有返回document found
db.collection.aggregate([
{
$group: {
_id: "$book.register.questions",
questions: {
$push: "$book.register.questions"
}
}
},
{
$match: {
"questions.name": "Question A"
}
}
])
谢谢你的帮助!🤙
2条答案
按热度按时间fykwrbwg1#
查询有点长。
1.
$match
--用点符号过滤文档,找到包含“问题A”的文档。$unwind
-将book.register
数组解构为多个文档。$unwind
-将book.register.questions
数组解构为多个文档。$unwind
-将book.register.questions.answers
数组解构为多个文档。1.
$group
-按book.register.questions.answers.label
分组,并根据book.register.questions.answers.selected
的值进行条件求和。如果为真,则加1。1.
$group
-按null
分组。这样做的目的是通过压入答案标签并将其计入answers
数组,将所有文档合并为一个文档。1.
$replaceWith
-替换输入文档,将answers
数组转换为键值对。Demo @ Mongo Playground
zdwk9cvp2#
它成功了!只需将第一个
$match
管道移到$unwind
管道之后:"$book.register.questions"
。@永顺=>非常感谢你的回答、你的React能力和你的回应质量!