使用 $project 和 $sort 的 MongoDb 聚合查询

Sad*_*Mad 5 aggregation mongodb

我的MongoDb集合如下

{
    "_id" : ObjectId("5a187babdbf0a03cdca0d0bc"),
    "aggregationDate" : "2017-10-31",
    "ipaddress" : "10.65.66.184",
    "first" : {
        "count" : 3
    },
    "second" : {
        "count" : 2
    },
    "third" : {
        "count" : 3
    },
}

{
    "_id" : ObjectId("5a187babdbf0a03cdca0d0bd"),
    "aggregationDate" : "2017-10-31",
    "ipaddress" : "10.65.66.182",
    "first" : {
        "count" : 4
    },
    "second" : {
        "count" : 10
    },
    "third" : {
        "count" : 4
    },
}

{
    "_id" : ObjectId("5a187babdbf0a03cdca0d0be"),
    "aggregationDate" : "2017-10-31",
    "ipaddress" : "10.65.66.189",
    "first" : {
        "count" : 3
    },
    "second" : {
        "count" : 1
    },
    "third" : {
        "count" : 12
    },
}
Run Code Online (Sandbox Code Playgroud)

我想显示第一个、第二个和第三个计数总和最高的文档。

在这种情况下,输出应该是 -

{
    "_id" : ObjectId("5a187babdbf0a03cdca0d0bd"),
    "aggregationDate" : "2017-10-31",
    "ipaddress" : "10.65.66.182",
    "first" : {
        "count" : 4
    },
    "second" : {
        "count" : 10
    },
    "third" : {
        "count" : 4
    },
}
Run Code Online (Sandbox Code Playgroud)

我只需要一个文档作为输出。

db.getCollection('foo').aggregate(
{
    $project: {
        _id: "$ipaddress",
        max: { $max: { $add: [ "$first.count", "$second.count", "$third.count"] } }
        }
 },       
 { $sort: { refCount: -1 }}
 )    
Run Code Online (Sandbox Code Playgroud)

我收到以下异常

"errmsg" : "exception: invalid operator '$max'"
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?或者我做错了什么。

chr*_*dam 8

您需要创建一个管道来创建额外的refCount字段来保存总计数。第一个管道是$addField因为它允许您向文档添加新字段。总和是由$add运营商实现的。

前面的管道步骤将是$sort按新字段降序对文档进行排序。

最后一步$limit将返回单个文档:

db.getCollection('foo').aggregate([
    {
        "$addFields": {
            "refCount": {
                "$add": ["$first.count", "$second.count", "$third.count"]
             }
        }
    },
    { "$sort": { "refCount": -1 } },
    { "$limit": 1 }
])
Run Code Online (Sandbox Code Playgroud)