我已经非常努力地阅读有关查找和排序的文档,但没有运气。我可以更改我的文档结构,如果它不适合我想要的操作,但我更喜欢我目前的结构。
所有用户都有姓名和一系列技能,每个技能都有名称和相关技能等级。所有用户都具备各种技能的技能水平。
这是我的结构:
{
"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 }
但由于我目前的结构,这不起作用。
我是否需要更改我的结构以便这样排序或者我可以使其工作吗?
答案 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" })
上的索引。