假设我在mongodb中有一个集合,其对象有一个嵌套数组。我想根据数组的特定元素的值进行排序。这可能吗?
例如(我刚刚做了例子),如果我有一组电影类型(动作,喜剧,浪漫)和用户提交的例子,我能否找到按日期排序的给定用户提交的所有对象这部电影?
例如,我想查找“Aaron”提交示例的所有类型,按照“Aaron”提交的示例年份排序。
它几乎就像是需要where where子句。
> db.movies.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.movies.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驱动程序。
答案 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”数组并按提交者过滤。