【问题标题】:Can I sort by an element within a nested array in Mongo?我可以按 Mongo 的嵌套数组中的元素排序吗?
【发布时间】:2014-11-07 03:50:09
【问题描述】:

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

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

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

这几乎就像排序中的需要 where 子句。

> db.movi​​es.find().pretty();

{
    "_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 驱动程序。

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    ...有什么方法可以仅按给定用户提交的内容排序?

    我认为这不会如你所愿。

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

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

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

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

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

    这里的问题是您使用的是“对象数组”,这会使整个过程复杂化。您的排序问题假设我们可以对内部对象采取行动,但实际上我们不能。

    请查看新的Aggregation Framework,它可能会提供您正在寻找的内容。请注意,这是目前不稳定分支中的一项功能。

    【讨论】:

    • 我认为我做不到,但觉得值得一试。我很高兴我提出了它,因为您提到的聚合框架似乎一旦准备好/稳定就可以让我到达那里。谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-05
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2015-04-02
      相关资源
      最近更新 更多