FieldPath 字段名称不能包含“.” 在 $group

Che*_*eng 6 mongodb

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

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

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

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
            }
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

我收到错误$group,说明

FieldPath field names may not contain '.'
Run Code Online (Sandbox Code Playgroud)

如果我不能指定'.' 在

        $group : 
        {
            _id : 
            {
                "eventsArgs.elementId" : "$elementId"
            },
Run Code Online (Sandbox Code Playgroud)

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

chr*_*dam 5

由于您只有一个组字段,因此最好的方法是仅_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
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

以下内容也应该有效:

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 }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)