使用$ project和$ sort进行MongoDb聚合查询

时间:2017-11-26 16:20:14

标签: mongodb aggregation

我的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
    },
}

我想显示具有最高计数总数,第二计数和第三计数的文档。

在这种情况下,输出应为 -

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

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

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

我收到以下异常

"errmsg" : "exception: invalid operator '$max'"

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

1 个答案:

答案 0 :(得分:1)

您需要创建一个管道,创建额外的refCount字段以保存总计数。第一个管道是 $addField ,因为它允许您向文档添加新字段。使用 $add 运算符即可实现总和。

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

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

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