对数组中的文档进行排序

时间:2015-01-29 08:47:44

标签: mongodb

我已经非常努力地阅读有关查找和排序的文档,但没有运气。我可以更改我的文档结构,如果它不适合我想要的操作,但我更喜欢我目前的结构。

所有用户都有姓名和一系列技能,每个技能都有名称和相关技能等级。所有用户都具备各种技能的技能水平。

这是我的结构:

{
    "name": "Alice",
    "skills": [
        {
            "name": "gardening",
            "level": 10
        },
        {
            "name": "shopping",
            "level": 7
        }
    ]
},
{
    "name": "Bruce",
    "skills": [
        {
            "name": "gardening",
            "level": 5
        },
        {
            "name": "shopping",
            "level": 10
        }
    ]
}

我有很多这些对象,我将称之为Users。我想根据他们的园艺技能level对用户进行排序。

我知道我可以通过查询查询访问等级10 Users,无论他们在哪个级别10级,我都可以使用查找查询:

{ 'skills.level' : 10 }

但是我希望按照他们的园艺技能水平对用户进行排序,使用类似命令:

{ "skills.gardening.level" : 1 }

但由于我目前的结构,这不起作用。

我是否需要更改我的结构以便这样排序或者我可以使其工作吗?

1 个答案:

答案 0 :(得分:1)

你可以在不改变你的文档结构的情况下完成这项工作,但是惩罚是操作不会使用索引,对很多用户而言会很慢。使用聚合框架:

> db.users.aggregate([
    { "$unwind" : "$skills" },
    { "$match" : { "skills.name" : "gardening" } }
    { "$sort" : { "skills.level" : 1 } }
])
{ "_id" : ObjectId(...), "name" : "Bruce", "skills" : { "name" : "gardening", "level" : 5 } }
{ "_id" : ObjectId(...), "name" : "Alice", "skills" : { "name" : "gardening", "level" : 10 } }

如果没有关于您如何使用该集合的任何其他信息,允许您对各个技能级别进行排序的最简单更改是重新设计文档,以便一个文档代表一个用户的一项技能: / p>

{
    "name" : "Alice",
    "skill" : "gardening",
    "level" : 10
}

对特定level的<{1}}进行排序:

skill

db.skills.find({ "skill" : "gardening" }).sort({ "level" : 1 }) 上的索引。

检索与旧用户文档具有等效信息的文档集合:

{ "skill" : 1, "level" : 1 }

db.skills.find({ "name" : "Alice" }) 上的索引。