Mongodb 按嵌套字段分组的Mongoose聚合问题

Mongodb 按嵌套字段分组的Mongoose聚合问题,mongodb,mongoose,Mongodb,Mongoose,我有一个存储用户出席活动的模式: event: _id: ObjectId, ... attendances: [{ user: { type: ObjectId, ref: 'User' }, answer: { type: String, enum: ['yes', 'no', 'maybe'] } }] } 样本数据: _id: '533483aecb41af00009a94c3', att

我有一个存储用户出席活动的模式:

event: 
  _id: ObjectId,
  ...
  attendances: [{
    user: {
      type: ObjectId,
      ref: 'User'
    },
    answer: {
      type: String,
      enum: ['yes', 'no', 'maybe']
    }
  }]
}
样本数据:

_id: '533483aecb41af00009a94c3',
attendances: [{
  user: '531770ea14d1f0d0ec42ae57',
  answer: 'yes',
}, {
  user: '53177a2114d1f0d0ec42ae63',
  answer: 'maybe',
}],
当我查询某个用户的所有出席人数时,我希望以以下格式返回此数据:

var attendances = {
  yes: ['533497dfcb41af00009a94d8'], // These are the event IDs
  no: [],
  maybe: ['533497dfcb41af00009a94d6', '533497dfcb41af00009a94d2']
}
我不确定aggegation管道是否会以这种格式返回它?所以我想我可以返回这个并轻松修改它:

var attendances = [
  answer: 'yes',
  ids: ['533497dfcb41af00009a94d8'],
},{
  answer: 'no',
  ids: ['533497dfcb41af00009a94d8']
}, {
  answer: 'maybe',
  ids:  ['533497dfcb41af00009a94d6', '533497dfcb41af00009a94d2']
}];
然而,我的尝试没有成功。它不按答案将其分组:

this.aggregate({
  $match: {
    'attendances.user': someUserId
}
}, {
  $project: {
    answer: '$attendances.answer' 
  }
}, {
  $group: {
    _id: '$answer',
    ids: {
      $addToSet: "$_id"
    }
  }
}, function(e, docs) {

});
我能以第一种想要的格式返回我需要的数据吗?如果不能,我如何更正上述代码以获得想要的结果


在这一点上-也许map reduce过程更合适?

下面的查询将帮助您接近您想要的答案。尽管它的格式与您期望的格式不完全相同,但您可以为每个答案选项获得单独的文档和一个事件id数组

db.collection.aggregate([
//释放“出席”数组
{“$放松”:“$出席人数”},
//用户匹配
{“$match”:{“attentations.user”:“53177a2114d1f0d0ec42ae63”},
//按答案分组并将事件id推送到数组中
{“$group”:{{U id:$attentations.answer”,事件id:{$push:$\U id}}
])
这将产生以下输出:

{
“结果”:[
{
“_id”:“是”,
“事件ID”:[
ObjectId(“53d968a8c4840ac54443a9d6”)
]
},
{
“_id”:“可能”,
“事件ID”:[
ObjectId(“53d968a8c4840ac54443a9d7”),
ObjectId(“53d968a8c4840ac54443a9d8”)
]
}
],
“好”:1
}

除了您已经发布的架构之外,您是否可以发布集合中的示例文档?@AnandJayabalan更新了这一功能-但是我必须为$match字段指定新的ObjectId(…)。你知道为什么它不能把它转换成字符串吗?