我知道在对集合执行find()时我可以使用$ orderBy。但我的集合包含其他对象,我该如何对这些对象进行排序?例如:
books: [{
title: 'book 1',
authors: [
{ name: 'jim' },
{ name: 'bob' },
]
}, {
title: 'book 2',
authors: [
{ name: 'steve' },
{ name: 'joe' },
]
}];
我想做db.collections.find();让它按顺序返回所有书籍(我知道如何使用$ orderBy,但我也希望作者排序。
答案 0 :(得分:2)
诀窍是在写入时而不是读取时间对文档进行排序。
如上所述,您要求MongoDB在文档到达您的应用程序之前对其进行修改。没有特定命令,Mongo不喜欢修改文档。其主要选项是聚合,地图缩小和投影。这些都不是特别适合您的问题:
而是以您希望的方式存储文档。最初编写或更新文档时,请使用authors
阵列上的$sort
阵列更新运算符。存储的BSON object将保留排序,因此在检索文档时将对数组进行排序。
这使得读取比使用聚合框架或映射reduce更简单,更快。
答案 1 :(得分:1)
我不完全确定你需要什么。 MongoDB返回完整的文档,因此所有书籍的作者列表必须在客户端编译或使用aggregation framework编译。它不能使用简单的查询来完成,因为它需要在排序操作之前进行投影。
此外,您可能希望拥有一份独特的作者列表,否则某些作者会在列表中出现数十次。
使用聚合框架,您可以这样做:
db.books.aggregate(
{"$unwind" : "$authors"}, // unwind the array
{$group : {"_id" : "$authors.name"} }, // distinct
{$sort : {"_id" : 1}}); // the actual sort