我可以按Mongo中嵌套数组中的元素排序吗?

时间:2012-02-05 22:57:53

标签: node.js mongodb

假设我在mongodb中有一个集合,其对象有一个嵌套数组。我想根据数组的特定元素的值进行排序。这可能吗?

例如(我刚刚做了例子),如果我有一组电影类型(动作,喜剧,浪漫)和用户提交的例子,我能否找到按日期排序的给定用户提交的所有对象这部电影?

例如,我想查找“Aaron”提交示例的所有类型,按照“Aaron”提交的示例年份排序。

它几乎就像是需要where where子句。

> db.movi​​es.find()相当();

{
    "_id" : ObjectId("4f2f07c1ec2cb81a269362c6"),
    "type" : "action",
    "examples" : [
        {
            "title" : "Gladiator",
            "year" : 2000,
            "submitter" : "Aaron"
        },
        {
            "title" : "Mission Impossiple",
            "year" : 1996,
            "submitter" : "Bill"
        },
        {
            "title" : "The Terminator",
            "year" : 1984,
            "submitter" : "Jane"
        }
    ]
}
{
    "_id" : ObjectId("4f2f07edaee5d897ea09f511"),
    "type" : "comedy",
    "examples" : [
        {
            "title" : "The Hangover",
            "year" : 2009,
            "submitter" : "Aaron"
        },
        {
            "title" : "Dogma",
            "year" : 1999,
            "submitter" : "Bill"
        },
        {
            "tile" : "Airplane",
            "year" : 1980,
            "submitter" : "Jane"
        }
    ]
}

> db.movi​​es.find({'examples.submitter':'Aaron'})。sort({'examples.year':1})。pretty();

{
    "_id" : ObjectId("4f2f07edaee5d897ea09f511"),
    "type" : "comedy",
    "examples" : [
        {
            "title" : "The Hangover",
            "year" : 2009,
            "submitter" : "Aaron"
        },
        {
            "title" : "Dogma",
            "year" : 1999,
            "submitter" : "Bill"
        },
        {
            "tile" : "Airplane",
            "year" : 1980,
            "submitter" : "Jane"
        }
    ]
}
{
    "_id" : ObjectId("4f2f07c1ec2cb81a269362c6"),
    "type" : "action",
    "examples" : [
        {
            "title" : "Gladiator",
            "year" : 2000,
            "submitter" : "Aaron"
        },
        {
            "title" : "Mission Impossiple",
            "year" : 1996,
            "submitter" : "Bill"
        },
        {
            "title" : "The Terminator",
            "year" : 1984,
            "submitter" : "Jane"
        }
    ]
}

请注意,文档按收集年份(按预期)排序返回 - 是否可以按给定用户提交的方式进行排序?对于一些额外的细节,我使用nodejs的node-native mongo驱动程序。

3 个答案:

答案 0 :(得分:5)

  

...只能按给定用户提交的方式进行排序吗?

我认为这不会按照你想要的方式解决。

在MongoDB中,查询返回整个文档。当您执行以下查询时,您将找到任何提交者与'Aaron'匹配的所有文档。

> db.movies.find({'examples.submitter': 'Aaron'})

请注意,'Aaron'理论上可以在同一文档中匹配两次,但只返回该文档一次。这使分拣问题变得复杂。

> db.movies.find({'examples.submitter': 'Aaron'}).sort({'examples.year': 1})

那么,当一个文档包含两个不同年份的'Aaron'时,您会发生什么?请记住,我们只能对文档进行排序,我们无法使用查询对内部数组进行排序。

这里的问题是你正在使用“对象数组”,这使整个过程变得复杂。你的排序问题假定我们可以对内部对象采取行动而我们真的不能。

请查看可能提供您所需内容的新Aggregation Framework。请注意,这是不稳定分支中的一个功能。

答案 1 :(得分:1)

如果其他人偶然发现了这一点,我可以通过创建一个类似的索引来解决类似的问题:

{'examples.submitter': 1, 'examples.year': 1}

如果强制查询使用提示使用此索引(" indexname"),您的结果将按索引的顺序返回。

答案 2 :(得分:0)

对于您的情况,您必须使用eval并在server side上进行自定义排序。有关排序的具体示例,请查看here。你的比较函数会有点复杂,因为你必须通过“examples”数组并按提交者过滤。