db.sort.drop(); db.sort.insert({stats: [{userId: 1, date: '01012013'},{userId: 2, date: '31122012'}]}); db.sort.insert({stats: [{userId: 1, date: '31122013'},{userId: 2, date: '01012012'}]}); > db.sort.find({'stats.userId': 1}).sort({'stats.date': 1}).pretty() { "_id" : ObjectId("52af1ce974be7dbd071e8563"), "stats" : [ { "userId" : 1, "date" : "31122013" }, { "userId" : 2, "date" : "01012012" } ] } { "_id" : ObjectId("52af1ce974be7dbd071e8562"), "stats" : [ { "userId" : 1, "date" : "01012013" }, { "userId" : 2, "date" : "31122012" } ] }
如何按日期userId排序文件:1?
我希望看到:
{ "_id" : ObjectId("52af1ce974be7dbd071e8562"), "stats" : [ { "userId" : 1, "date" : "01012013" }, { "userId" : 2, "date" : "31122012" } ] } { "_id" : ObjectId("52af1ce974be7dbd071e8563"), "stats" : [ { "userId" : 1, "date" : "31122013" }, { "userId" : 2, "date" : "01012012" } ] }
答案 0 :(得分:2)
有些事情:
db.COLLECTION.find({stats.userID: 1}).sort({'stats.date':1})
鉴于上面的数据,当我执行该查询时,我得到了回复:
"stats" : [
{
"userId" : 1,
"date" : 1012013
}
答案 1 :(得分:0)
您可以使用聚合框架来实现
db.sort.aggregate(
[
{$unwind:"$stats"},
{$match:{"stats.userId":1}},
{$sort:{"stats.date":1}}
]);
如果您可以更改架构以将用户+ ID组合存储为字段名称,并将日期作为其值,那么您可以轻松完成此操作
> db.so2.find().pretty()
{
"_id" : 1,
"stats" : [
{
"userId1" : "01012013"
},
{
"userId2" : "31122012"
}
]
}
{
"_id" : 2,
"stats" : [
{
"userId1" : "31122013"
},
{
"userId2" : "01012012"
}
]
}
然后从userId:1更改查询谓词以检查userId字段是否存在
> db.so2.find({"stats.userId1":{$exists:1}}).sort({"stats.userId1":1}).pretty()
{
"_id" : 1,
"stats" : [
{
"userId1" : "01012013"
},
{
"userId2" : "31122012"
}
]
}
{
"_id" : 2,
"stats" : [
{
"userId1" : "31122013"
},
{
"userId2" : "01012012"
}
]
}