【问题标题】:$Sort $addToSet within $group's - MongoDB queries$group 内的 $Sort $addToSet - MongoDB 查询
【发布时间】:2017-03-16 23:05:15
【问题描述】:

目前我有:

db.questionanswers.aggregate( 
  [ 
    sessionStarted: {$first: "$created"}, QuestionsSubmitted: {$last: "$created"}, answer: {$addToSet: "$answer"}}}
  ],
  {
    allowDiskUse: true
  }
)

它聚合了一个对象列表,其中每个对象的答案组通过 quizID 和 sessionID 相关。

查看Stackoverflow answer 对我的 $addToSet 数组进行排序后,我将查询修改为:

db.questionanswers.aggregate( 
  [ 
    {$unwind: "$answer"},
    {$group : {_id : {sessionId: "$sessionId", quizID: "$quizId" }, answer: {$addToSet: "$answer"} }},
    {$unwind : "$answer"},
    {$sort : {"answer": 1}},
    {$group : { _id : {sessionId: "$sessionId", quizID: "$quizId" }, sessionStarted: {$first: "$created"}, QuestionsSubmitted: {$last: "$created"}, answer: {$push: "$answer"}}}
  ],
  {
    allowDiskUse: true
  }
)

我进入 Robomongo script executed successfully, but there are no results to show

我尝试从same answer above 和我的_id : {sessionId: "$sessionId", quizID: "$quizId" } 查询切换_id : null,但它不返回任何结果,除非在两者上使用_id : null 并返回一个巨大组中的所有排序答案,这是有道理的,但这不是我所追求的。任何想法如何使用$group 对每个答案$addToSet 进行排序?

编辑:

聚合自

{
  "_id" : ObjectId("xxx"),
  "quizId" : "xxx",
  "sessionId" : "xxx",
  "questionId" : "gender",
  "categoryId" : "1",
  "question" : "male or female",
  "answer" : "male",
  "created" : ISODate("2015-12-xxx"),
  "__v" : 0
},
{
  "_id" : ObjectId("xxx"),
  "quizId" : "xxx",
  "sessionId" : "xxx",
  "questionId" : "gender",
  "categoryId" : "1",
  "question" : "question 1",
  "answer" : "answer a",
  "created" : ISODate("2015-12-xxx"),
  "__v" : 0
}, // etc //

编辑2:

预期输出:

{
  "_id" : {
    "quizId" : "xxx",
    "sessionId" : "xxx",
  },
  "sessionStarted" : "2015-12-xxx",
  "QuestionsSubmitted" : "2015-12-xxx"
  "answer" : {
    "0" : "answer a",
    "1" : "answer b"
    // etc //
  }
}

【问题讨论】:

  • 能否添加示例文档?

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

有两个问题

1)

 sessionStarted: {$first: "$created"}

由于聚合具有管道阶段, 在您的第一个 $group 管道阶段没有 created 变量,所以,首先添加创建的变量

2)

你的第二个小组赛阶段是

{$group : { _id : {sessionId: "$sessionId", quizID: "$quizId" }, sessionStarted: {$first: "$created"}, QuestionsSubmitted: {$last: "$created"}, answer: {$push: "$answer"}}}

这里没有 sessionId 变量, 替换

$sessionId with $_id.sessionId 

$quizIdwith $_id.quizId

这是你的答案,请试试这个

db.questionanswers.aggregate( 
  [ 
    {$group : {_id : {sessionId: "$sessionId", quizID: "$quizId" }, answer: {$addToSet: "$answer"},sessionStarted: {$first: "$created"}, QuestionsSubmitted: {$last: "$created"} },
    {$unwind : "$answer"},
    {$sort : {answer: 1}},
    {$group : { _id : {sessionId: "$_id.sessionId", quizID: "$_id.quizId" }, sessionStarted: {$first: "$sessionStarted"}, QuestionsSubmitted: {$last: "$QuestionsSubmitted"}, answer: {$addToSet: "$answer"}}}
  ]
)

请试试这个

【讨论】:

  • 添加了我想要的输出。谢谢
  • 以上都不起作用,仍然返回executed successfully, but there are no results to show。还尝试了 _id.answer 的组合。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2020-03-21
  • 1970-01-01
  • 2021-01-23
  • 2017-07-06
  • 2022-01-03
相关资源
最近更新 更多