如何对嵌套对象进行排序

时间:2013-12-16 14:19:51

标签: mongodb


    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"
                    }
            ]
    }

2 个答案:

答案 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"
                }
        ]
}