在Meteor中按多个字段分组

时间:2017-09-03 06:26:05

标签: javascript mongodb meteor aggregation-framework

我想要实现的是,在给定的日期范围内,我想先按用户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

1 个答案:

答案 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

但这可能是作者考虑更新包装的注意事项。