はい、これを行うには2つの方法があります。したがって、 $ elemMatch コード>
わずかな変更を加えて、すでに持っているように投影側で:
Model.findById(id,
{ "comments": { "$elemMatch": {"created.by": "Jane" } } },
function(err,doc) {
または、クエリ部分に追加して、位置 $
を使用します 演算子:
Model.findOne(
{ "_id": id, "comments.created.by": "Jane" },
{ "comments.$": 1 },
function(err,doc) {
どちらの方法も完全に有効です。
それよりも少し複雑なものが必要な場合は、 .aggregate()
メソッドであり、 $ project
代わりに演算子:
Model.aggregate([
// Still match the document
{ "$match": "_id": id, "comments.created.by": "Jane" },
// Unwind the array
{ "$unwind": "$comments" },
// Only match elements, there can be more than 1
{ "$match": "_id": id, "comments.created.by": "Jane" },
// Project only what you want
{ "$project": {
"comments": {
"body": "$comments.body",
"by": "$comments.created.by"
}
}},
// Group back each document with the array if you want to
{ "$group": {
"_id": "$_id",
"comments": { "$push": "$comments" }
}}
],
function(err,result) {
したがって、集約フレームワークは、単に結果を集約するだけではなく、はるかに多くの目的で使用できます。 $ project
演算子を使用すると、 .find()
を使用したプロジェクションよりも柔軟性が高くなります。 。また、複数の配列結果をフィルタリングして返すこともできます。これは、 .find()
の射影では実行できないことでもあります。 。