Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 项目至;“过滤器”;第二个嵌套数组中的属性_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 项目至;“过滤器”;第二个嵌套数组中的属性

Mongodb 项目至;“过滤器”;第二个嵌套数组中的属性,mongodb,aggregation-framework,Mongodb,Aggregation Framework,好吧,我已经试着解决这个问题有一段时间了,但似乎在兜圈子 我的主要目标是深入第二个嵌套数组,并完全删除'isCorrectAnswer'属性。。。对象基本上是一个项目,有2个问题,每个问题有3个答案选项 在应用程序的“应答”时间段内,我需要删除“isCorrectAnswer”,这样用户就不会通过查看正在传递的数据来作弊。。。然后,一旦“应答”时间段过去,它将作为完整对象返回,以向用户指示哪些应答是正确的 “item”对象及其问题和答案从MongoDB返回的示例如下: { “_id”:Objec

好吧,我已经试着解决这个问题有一段时间了,但似乎在兜圈子

我的主要目标是深入第二个嵌套数组,并完全删除'isCorrectAnswer'属性。。。对象基本上是一个项目,有2个问题,每个问题有3个答案选项

在应用程序的“应答”时间段内,我需要删除“isCorrectAnswer”,这样用户就不会通过查看正在传递的数据来作弊。。。然后,一旦“应答”时间段过去,它将作为完整对象返回,以向用户指示哪些应答是正确的

“item”对象及其问题和答案从MongoDB返回的示例如下:

{
“_id”:ObjectId(“5397e4b75c4c9bf0509709ab”),
“名称”:“项目名称”,
“说明”:“项目说明”,
“问题”:[
{
“_id”:ObjectId(“5397eb925d2664177b0fc5a5”),
“问题”:“项目问题1”,
“答案”:[
{
“_id”:ObjectId(“5397eb925d2664177b0fc5a6”),
“答案”:“第1项问题-答案1”,
“isCorrectAnswer”:正确
},
{
“_id”:ObjectId(“5397eb925d2664177b0fc5a7”),
“答案”:“第1项问题-答案2”,
“isCorrectAnswer”:错误
},
{
“_id”:ObjectId(“5397eb925d2664177b0fc5a8”),
“答案”:“第1项问题-答案3”,
“isCorrectAnswer”:错误
}
]
},
{
“_id”:ObjectId(“5397eb925d2664177b0fc5a9”),
“问题”:“项目问题2”,
“答案”:[
{
“_id”:ObjectId(“5397eb925d2664177b0fc5aa”),
“答案”:“第2项问题-答案1”,
“isCorrectAnswer”:错误
},
{
“_id”:ObjectId(“5397eb925d2664177b0fc5ab”)
“答案”:“第2项问题-答案2”,
“isCorrectAnswer”:正确
},
{
“_id”:ObjectId(“5397eb925d2664177b0fc5ac”),
“答案”:“第3项问题-答案3”,
“isCorrectAnswer”:错误
}
]
}
]
}
现在,根据我从MongoDB课程中学到的

我的第一个目标是做一次双重放松,将所有的东西都展平成单个对象结构

因此,聚合管道中的第一个步骤是:

{“$unwind”:“$questions”},
{“$放松”:“$问题.答案”}
这个很好用

我的下一步是运行$project以删除“isCorrectAnswer”属性:

{“$project”:{
“_id”:1,
“名称”:1,
"说明":一,,
“问题”:{
“\u id”:“$questions.\u id”,
“问题”:“$questions.question”,
“答案”:{
“_id”:“$questions.answers._id”,
“答案”:“$questions.answers.answer”
}
}
}}
这也很好用

现在我的不足之处是将对象重新组合到原始结构中(没有“isCorrectAnswer”属性)

接下来,我可以在管道中运行$group命令,这确实有效,但答案不会与问题一起重新分组

{“$group”:{
“_id”:{
“\u id”:“$\u id”,
“序号”:“$ordinal”,
“名称”:“$name”,
“说明”:“$description”,
“福利”:“$福利”,
“SpecialLoffer”:“$SpecialLoffer”,
“choicePoints”:“$choicePoints”,
“bonusPoints”:“$bonusPoints”,
“兑换积分”:“$redemptionPoints”,
“问题”:“$问题”
}
}}
我仍然掌握聚合框架,更多的是使用$group命令。。。我想知道我是否应该采取不同的步骤,或者如何运行第二个$group来将“答案”组合在一起

我还假设我需要运行最后一个$project来清理通过$group添加的'\u id'属性

谢谢你的帮助


Derek

您可以使用$unset运算符,结合点表示法来删除属性

例如,以下命令将从first answers数组中删除isCorrectAnswer属性:


db.collectionname.update({u id:“SOME_id”},{$unset:{“questions.0.answers.0.isCorrectAnswer”:“}})

因为您的要求是只“投影”文档,所以字段被屏蔽,是的,聚合框架是一个用于执行此操作的工具。不过,在展开阵列和重建时,您需要稍微了解一下这个过程

所以你想要的是:

db.collection.aggregate([
{“$diswind”:“$questions”},
{“$diswind”:“$questions.answers”},
{“$group”:{
“_id”:{
“\u id”:“$\u id”,
“名称”:“$name”,
“说明”:“$description”,
“qid”:“$questions.\u id”,
“问题”:“$questions.question”
},
“答案”:{
“$push”:{
“_id”:“$questions.answers._id”,
“答案”:“$questions.answers.answer”
}
}
}},
{“$project”:{
“问题”:{
“_id”:“$_id.qid”,
“问题”:“$\u id.question”,
“答案”:“$answers”
}
}},
{“$sort”:{“_id”:1,“问题._id”:1},
{“$组”:{
“\u id”:“$\u id.\u id”,
“name”:{“$first”:“$\u id.name”},
“description”:{“$first”:“$\u id.description”},