これは、MongoDBが配列要素を使用した基本的なプロジェクションを処理する方法です。あなたはこのようなことをすることができますが:
Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) {
})
そして、それは、条件に一致するすべてのドキュメントとすべての配列要素のコメント配列のサブドキュメント内から「賛成」フィールドを返すだけです。もちろん、 position $
オペレーター。これは基本的に「理論」に由来します その一般的に 実際には、配列全体を返したいと考えています。したがって、これは常に機能しており、すぐに変更される可能性は低い方法です。
必要なものを取得するには、集約フレームワーク 。これにより、ドキュメントの返送方法をより細かく制御できます。
Model.aggregate(
[
// Match the document containing the array element
{ "$match": { "comments._id" : oid } },
// Unwind to "de-normalize" the array content
{ "$unwind": "$comments" },
// Match the specific array element
{ "$match": { "comments._id" : oid } },
// Group back and just return the "upvotes" field
{ "$group": {
"_id": "$_id",
"comments": { "$push": { "upvotes": "$comments.upvotes" } }
}}
],
function(err,docs) {
}
);
または、2.6以降のMongoDBの最新バージョンでは、これを行うこともできます:
Model.aggregate(
[
{ "$match": { "comments._id" : oid } },
{ "$project": {
"comments": {
"$setDifference": [
{ "$map": {
"input": "$comments",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el._id", oid ] },
{ "upvotes": "$$el.upvotes" },
false
]
}
}},
[false]
]
}}
}}
],
function(err,docs) {
}
)
そして、それは $map
を使用します
および$setDifference
演算子は、最初に $unwind
ステージ。
したがって、ドキュメントが返される方法をより細かく制御したい場合は、埋め込みドキュメントを操作するときに集約フレームワークがそれを行う方法です。