Mongodb 如何对嵌套对象进行排序 db.sort.drop(); insert({stats:[{userId:1,日期:'01012013'},{userId:2,日期:'3112212'}]}); insert({stats:[{userId:1,日期:'3112103'},{userId:2,日期:'01012012'}]}); >db.sort.find({'stats.userId':1}).sort({'stats.date':1}).pretty() { “_id”:ObjectId(“52af1ce974be7dbd071e8563”), “统计数据”:[ { “用户ID”:1, “日期”:“31122013” }, { “用户ID”:2, “日期”:“01012012” } ] } { “_id”:ObjectId(“52af1ce974be7dbd071e8562”), “统计数据”:[ { “用户ID”:1, “日期”:“01012013” }, { “用户ID”:2, “日期”:“311220012” } ] }

Mongodb 如何对嵌套对象进行排序 db.sort.drop(); insert({stats:[{userId:1,日期:'01012013'},{userId:2,日期:'3112212'}]}); insert({stats:[{userId:1,日期:'3112103'},{userId:2,日期:'01012012'}]}); >db.sort.find({'stats.userId':1}).sort({'stats.date':1}).pretty() { “_id”:ObjectId(“52af1ce974be7dbd071e8563”), “统计数据”:[ { “用户ID”:1, “日期”:“31122013” }, { “用户ID”:2, “日期”:“01012012” } ] } { “_id”:ObjectId(“52af1ce974be7dbd071e8562”), “统计数据”:[ { “用户ID”:1, “日期”:“01012013” }, { “用户ID”:2, “日期”:“311220012” } ] },mongodb,Mongodb,如何获得按日期排序的文档userId:1 我希望看到: 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({'

如何获得按日期排序的文档userId:1
我希望看到:

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" } ] } { “_id”:ObjectId(“52af1ce974be7dbd071e8562”), “统计数据”:[ { “用户ID”:1, “日期”:“01012013” }, { “用户ID”:2, “日期”:“311220012” } ] } { “_id”:ObjectId(“52af1ce974be7dbd071e8563”), “统计数据”:[ { “用户ID”:1, “日期”:“31122013” }, { “用户ID”:2, “日期”:“01012012” } ] }
大致如下:

{ "_id" : ObjectId("52af1ce974be7dbd071e8562"), "stats" : [ { "userId" : 1, "date" : "01012013" }, { "userId" : 2, "date" : "31122012" } ] } { "_id" : ObjectId("52af1ce974be7dbd071e8563"), "stats" : [ { "userId" : 1, "date" : "31122013" }, { "userId" : 2, "date" : "01012012" } ] } 根据上面的数据,当我执行该查询时,我得到了以下信息:

db.COLLECTION.find({stats.userID: 1}).sort({'stats.date':1})

您可以使用聚合框架来实现

"stats" : [ 
    {
        "userId" : 1,
        "date" : 1012013
    }
如果您可以更改模式,将user+id组合存储为字段名,并将日期作为其值,那么您就可以轻松地完成这项工作

db.sort.aggregate(
[
        {$unwind:"$stats"},
        {$match:{"stats.userId":1}},
        {$sort:{"stats.date":1}}
]);
然后将查询谓词从userId:1更改为检查userId字段是否存在

> db.so2.find().pretty()
{
        "_id" : 1,
        "stats" : [
                {
                        "userId1" : "01012013"
                },
                {
                        "userId2" : "31122012"
                }
        ]
}
{
        "_id" : 2,
        "stats" : [
                {
                        "userId1" : "31122013"
                },
                {
                        "userId2" : "01012012"
                }
        ]
}

谢谢你的评论。但在本例中,它将对所有日期进行排序,但我只需要按userId date排序。它会按userId查找文档,然后对。。。?问题出在哪里?我更新了文件。如果您按日期排序,第一份文档将位于第二位,因为所有日期都已排序。我不确定您的意思,请编辑您的问题并发布您的预期输出。您完全改变了数据结构。我现在不知道你希望得到什么样的结果?如果你按日期排序,文档将是第一个日期为01012012的文档,但我希望看到日期为01012013的文档,根据需要按特定用户编辑的答案排序,我得到了你期望的结果莱克斯我更正了问题谢谢评论!但是在这种情况下,您不能配置索引。如果您使用的是备用模式,那么您可以索引stats.userId1
> 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"
                }
        ]
}