我有一个文档设计,用于在每个月对用户的活动进行排名。 每个用户都有这样的排名记录器:
{
_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)`
但所有这些都不起作用 如何用指定月份排名?谢谢
答案 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}
的转储,所以它表明在这种情况下不使用索引。
欢迎任何评论!