【问题标题】:FieldPath field names may not contain '.' in $groupFieldPath 字段名称可能不包含“。”在$组中
【发布时间】:2017-02-24 07:36:03
【问题描述】:

我有以下看起来像这样的 mongo 数据

{
    eventType : "mousedown",
    eventArgs : {
        type : "touchstart",
        elementId : "id1"
    },
    creationDateTime : ISODate("2017-02-24T07:05:49.986Z")
}

我编写了以下查询来执行组计数。

db.analytics.aggregate
(
    {
        $match :
        {
            $and : 
            [
                {"eventArgs.type" : 'touchstart'}, 
                {eventType : 'mousedown'}, 
                {creationDateTime : {$gte : ISODate("2017-02-24T000:00:00.000Z")}}
            ]
        }
    },
    {
        $group : 
        {
            _id : 
            {
                "eventsArgs.elementId" : "$elementId"
            },
            count : 
            {
                $sum : 1
            }
        }
    }
);

我收到$group 的错误,其中指出

FieldPath field names may not contain '.'

如果我不能具体的 '.'在

        $group : 
        {
            _id : 
            {
                "eventsArgs.elementId" : "$elementId"
            },

这样做的正确方法是什么?

【问题讨论】:

  • 你试过"_id" : { "eventsArgs": { "elementId" : "$eventsArgs.elementId" } },吗?
  • 是的。它不会给出错误。但是,生成的结果是不希望的:{ "_id" : { "eventsArgs" : { } }, "count" : 126311 }。我希望看到带有各种 elementId 的多个计数附加。
  • 或简单地{ "$group": { "_id": "$eventsArgs.elementId", "count": { "$sum": 1 } } } 然后再添加一个$project 管道以按照您想要的方式重塑输出?
  • 但是数据相当庞大(有5亿行)。我更喜欢先过滤,然后再按计数分组。
  • @CheokYanCheng 你运行的是什么版本的mongodb?

标签: mongodb


【解决方案1】:

由于您只有一个组字段,因此最好的方法是在该字段上使用 _id 组键,然后创建另一个 $project 管道,该管道将重塑 _id 键从上一个管道到您想要的所需子文档。例如

db.analytics.aggregate([
    {
        "$match": {
            "eventArgs.type": 'touchstart', 
            "eventType": 'mousedown', 
            "creationDateTime": { "$gte": ISODate("2017-02-24T000:00:00.000Z") } 
        }
    },
    {
        "$group": {
            "_id": "$eventArgs.elementId",
            "count": { "$sum": 1 }
        }
    },
    {
        "$project": {
            "eventsArgs.elementId": "$_id",
            "count": 1, "_id": 0
        }
    }
]);

以下内容也应该有效:

db.analytics.aggregate([
    {
        "$match": {
            "eventArgs.type": 'touchstart', 
            "eventType": 'mousedown', 
            "creationDateTime": { "$gte": ISODate("2017-02-24T000:00:00.000Z") } 
        }
    },
    {
        "$group": {
            "_id": {
               "eventArgs": {
                   "elementId": "$eventArgs.elementId"
               }
            },
            "count": { "$sum": 1 }
        }
    }
]);

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2020-11-27
    • 2015-06-25
    • 1970-01-01
    • 2021-08-25
    • 2019-06-02
    相关资源
    最近更新 更多