如何用mongo对文档内部数组对象进行排名?

时间:2016-08-18 15:33:41

标签: mongodb

我有一个文档设计,用于在每个月对用户的活动进行排名。 每个用户都有这样的排名记录器:

{
    _id: ObjectId //user id
    month_record:[
        {
            month: "2016-08",
            sum: 100
        },
        {
            month: "2016-09",
            sum: 100
        },
        ...
    ]
    sum: 1400
}

我尝试使用以下方式搜索指定的月份排名(前30名)

db.getCollection('activities')
    .find({"month_record.month": {"$eq":"2016-08"}})
    .sort({"month_record.$.sum":-1}).limit(30)  

db.getCollection('activities')
    .find().sort({"month_record.month": {"$eq":"2016-08"},"month_record.$.sum":-1})
    .limit(30)`  

但所有这些都不起作用 如何用指定月份排名?谢谢

1 个答案:

答案 0 :(得分:1)

最简单的解决方法是通过聚合框架:

db.activities.aggregate([{
        $match : {
            "month_record.month" : {
                "$eq" : "2016-08"
            }
        }
    }, {
        $unwind : "$month_record"
    }, {
        $match : {
            "month_record.month" : {
                "$eq" : "2016-08"
            }
        }
    }, {
        $sort : {
            "month_record.sum" : -1
        }
    }, {
        $limit : 30
    }
])

===================

修改

{
    "waitedMS" : NumberLong(0),
    "stages" : [ 
        {
            "$cursor" : {
                "query" : {},
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "test.lorence",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "$and" : []
                    },
                    "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                            "$and" : []
                        },
                        "direction" : "forward"
                    },
                    "rejectedPlans" : []
                }
            }
        }, 
        {
            "$unwind" : {
                "path" : "$month_record"
            }
        }, 
        {
            "$match" : {
                "month_record.month" : {
                    "$eq" : "2016-08"
                }
            }
        }, 
        {
            "$sort" : {
                "sortKey" : {
                    "month_record.sum" : -1
                },
                "limit" : NumberLong(30)
            }
        }
    ],
    "ok" : 1.0
}

因为这是执行计划{explain:true}的转储,所以它表明在这种情况下不使用索引。

欢迎任何评论!