MongoDB find()命令子对象

时间:2013-10-15 15:59:36

标签: mongodb

我知道在对集合执行find()时我可以使用$ orderBy。但我的集合包含其他对象,我该如何对这些对象进行排序?例如:

books: [{
  title: 'book 1',
  authors: [
     { name: 'jim' },
     { name: 'bob' },
  ]
}, {
  title: 'book 2',
  authors: [
     { name: 'steve' },
     { name: 'joe' },
  ]
}];

我想做db.collections.find();让它按顺序返回所有书籍(我知道如何使用$ orderBy,但我也希望作者排序。

2 个答案:

答案 0 :(得分:2)

诀窍是在写入时而不是读取时间对文档进行排序。

如上所述,您要求MongoDB在文档到达您的应用程序之前对其进行修改。没有特定命令,Mongo不喜欢修改文档。其主要选项是聚合,地图缩小和投影。这些都不是特别适合您的问题:

  • 聚合可能比您需要的更复杂,请参阅此处的选项的其他答案。
  • Map Reduce就像聚合,但更复杂。
  • Query-time Projection可以过滤返回的字段,但没有排序选项。

而是以您希望的方式存储文档。最初编写或更新文档时,请使用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