我想要实现的是,在给定的日期范围内,我想先按用户time
分组,然后按userId
分组。
我在下面尝试查询按多个字段分组,
ReactiveAggregate(this, Questionaire,
[
{
"$match": {
"time": {$gte: fromDate, $lte: toDate},
"userId": {'$regex' : regex}
}
},
{
$group : {
"_id": {
"userId": "$userId",
"date": { $dateToString: { format: "%Y-%m-%d", date: "$time" } }
},
"total": { "$sum": 1 }
}
}
], { clientCollection: "Questionaire" }
);
但是当我在服务器端执行它时,它会向我显示以下错误,
Exception from sub Questionaire id kndfrx9EuZ5EejKmE
Error: Meteor does not currently support objects other than ObjectID as ids
答案 0 :(得分:1)
该消息实际上说明了所有内容,因为_id
生成的clientCollection
值实际上不会在_id
输出中生成。< / p>
当然,简单的解决方案是不使用$group
中生成的_id
值作为生成输出中的“最终”_id
值。正如$group
上的示例所示,只需添加project README即可删除ReactiveAggregate(this, Questionaire,
[
{
"$match": {
"time": {$gte: fromDate, $lte: toDate},
"userId": {'$regex' : regex}
}
},
{
$group : {
"_id": {
"userId": "$userId",
"date": { $dateToString: { format: "%Y-%m-%d", date: "$time" } }
},
"total": { "$sum": 1 }
}
},
// Add the reshaping to the end of the pipeline
{
"$project": {
"_id": 0, // remove the _id, this will be automatically filled
"userDate": "$_id", // the renamed compound key
"total": 1
}
}
], { clientCollection: "Questionaire" }
);
,并将当前的“复合分组键”重命名为不同的属性名称:
"total"
字段顺序会有所不同,因为MongoDB会保留现有字段(例如本例中为1
),然后将任何新字段添加到文档中。您可以使用$project
和$group
阶段中的不同字段名称而不是_id
包含语法来表示。
如果没有这样的插件,通过再次重命名输出_id
并提供与流星客户端集合所期望的兼容的新_id
值,这种重塑具有$project
。出现在这家酒店。
仔细检查been regularly done in the past后,最好在结果中实际提供_id
值,因为插件实际上不会创建_id
值。
因此,只需在分组中提取现有文档_id
之一就足够了。所以我会添加how the code is implemented来执行此操作,然后替换$max
中的ReactiveAggregate(this, Questionaire,
[
{
"$match": {
"time": {$gte: fromDate, $lte: toDate},
"userId": {'$regex' : regex}
}
},
{
$group : {
"_id": {
"userId": "$userId",
"date": { $dateToString: { format: "%Y-%m-%d", date: "$time" } }
},
"maxId": { "$max": "$_id" },
"total": { "$sum": 1 }
}
},
// Add the reshaping to the end of the pipeline
{
"$project": {
"_id": "$maxId", // replaced _id
"userDate": "$_id", // the renamed compound key
"total": 1
}
}
], { clientCollection: "Questionaire" }
);
:
if (!sub._ids[doc._id]) {
sub.added(options.clientCollection, doc._id, doc);
} else {
sub.changed(options.clientCollection, doc._id, doc);
}
可以通过$project
_id
当从管道输出的文档尚未存在 if (!sub._ids[doc._id]) {
sub.added(options.clientCollection, doc._id || Random.id(), doc);
} else {
sub.changed(options.clientCollection, doc._id || Random.id(), doc);
}
值时使用replacing the lines:
DataViewController
但这可能是作者考虑更新包装的注意事项。