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(…)。你知道为什么它不能把它转换成字符串吗?