find
MongoDB クエリの通常のオプションでは、配列の「最後の」要素にアクセスし、それをフィルタリングすることだけが困難/不可能であるため、いくつかのオプションがあります。$slice
(残念ながら、ではできませんfind
)。
- 最新の発行済みデータ
publisher
を配列と特別な (非正規化/コピー) データを book オブジェクトに直接保存します。そして例えば。クエリはシンプルで超高速です。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 番目のオプション #3 が続くことをお勧めします。