我非常努力地阅读关于查找和排序的文档,但没有运气。如果文档结构不适合我想做的操作,我可以更改它,但是我更喜欢我的当前结构。
所有用户都有名称和一系列技能,每个用户都有名称和相关的技能级别。所有用户在每项技能中都有自己的技能水平。
这是我的结构:
{
"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 }但由于我目前的结构,这是行不通的。
我是否需要改变我的结构才能像这样排序,还是我能让它发挥作用?
发布于 2015-01-30 16:14:55
您可以在不更改文档结构的情况下完成此操作,但代价是操作将不使用索引,而且对许多用户来说非常缓慢。使用聚合框架:
> 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 } }在没有关于如何使用集合的任何其他信息的情况下,允许对单个技能级别进行排序的最简单的更改是重新设计文档,以便一个文档代表一个用户的一项技能:
{
"name" : "Alice",
"skill" : "gardening",
"level" : 10
}对特定level的skill排序
db.skills.find({ "skill" : "gardening" }).sort({ "level" : 1 }){ "skill" : 1, "level" : 1 }索引。
检索具有与旧用户文档等效信息的文档集合:
db.skills.find({ "name" : "Alice" }){ "name" : 1 }索引。
https://stackoverflow.com/questions/28233568
复制相似问题