有几个选项,因为访问数组中的“最后一个”元素并且仅使用find
MongoDB 查询中的普通选项进行过滤是困难/不可能的。(不幸的是,您不能$slice
使用find
)。
- 将最新发布
publisher
的数据存储year
在print_runs
数组和数据的特殊(非规范化/副本)中,直接在书籍对象上。Book.last_published_by
例如Book.last_published_date
。查询将非常简单且超级快速。
- MapReduce。这很简单,可以发出数组中的最后一个元素,然后“减少”它。您需要在 MapReduce 上进行增量更新以保持准确。
- 写一个比较复杂的聚合框架表达式
聚合可能如下所示:
db.so.aggregate({ $project :
{ _id: 1, "print_run_year" : "$print_runs.year" }},
{ $unwind: "$print_run_year" },
{ $group : { _id : "$_id", "newest" : { $max : "$print_run_year" }}},
{ $match : { "newest" : { $gt : 1991, $lt: 2000 } }
})
因为它可能需要一些解释:
- 它预测和展开每本书的印刷年份。
- 然后,对
_id
本书的 ( 进行分组,并创建一个名为的新计算域,newest
其中包含最高的印刷年份 (来自投影)。
- 然后,
newest
使用$gt
和过滤$lt
从效率的角度来看,我建议上面的选项#1 是最好的,其次是 MapReduce,然后是第三个选项#3。