首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组中文档的排序

数组中文档的排序
EN

Stack Overflow用户
提问于 2015-01-29 08:47:43
回答 1查看 32关注 0票数 0

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

所有用户都有名称和一系列技能,每个用户都有名称和相关的技能级别。所有用户在每项技能中都有自己的技能水平。

这是我的结构:

代码语言:javascript
复制
{
    "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级的哪一种技能:

代码语言:javascript
复制
{ 'skills.level' : 10 }

但是,我想根据用户的园艺技能级别对他们进行排序,使用排序命令如下:

代码语言:javascript
复制
{ "skills.gardening.level" : 1 }

但由于我目前的结构,这是行不通的。

我是否需要改变我的结构才能像这样排序,还是我能让它发挥作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 16:14:55

您可以在不更改文档结构的情况下完成此操作,但代价是操作将不使用索引,而且对许多用户来说非常缓慢。使用聚合框架:

代码语言:javascript
复制
> 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 } }

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

代码语言:javascript
复制
{
    "name" : "Alice",
    "skill" : "gardening",
    "level" : 10
}

对特定levelskill排序

代码语言:javascript
复制
db.skills.find({ "skill" : "gardening" }).sort({ "level" : 1 })

{ "skill" : 1, "level" : 1 }索引。

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

代码语言:javascript
复制
db.skills.find({ "name" : "Alice" })

{ "name" : 1 }索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28233568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档