इस प्रकार MongoDB सरणी तत्वों के साथ मूल प्रक्षेपण को संभालता है। जबकि आप कुछ ऐसा कर सकते हैं:
Model.findOne({}, { "comments.upvotes": 1 },function(err,doc) {
})
और यह स्थिति से मेल खाने वाले सभी दस्तावेज़ों और निश्चित रूप से सभी सरणी तत्वों के लिए टिप्पणी सरणी के उप-दस्तावेज़ों के भीतर से "अपवोट्स" फ़ील्ड को वापस कर देगा, आप इसे स्थितिगत $
ऑपरेटर। यह मूल रूप से "सिद्धांत" . से उपजा है कि आम तौर पर आप वास्तव में पूरी सरणी वापस करना चाहते हैं। इसलिए इसने हमेशा काम किया है और इसके जल्द बदलने की संभावना नहीं है।
आप जो चाहते हैं उसे प्राप्त करने के लिए, आपको एकत्रीकरण ढांचा . यह आपको इस पर अधिक नियंत्रण देता है कि दस्तावेज़ कैसे लौटाए जाते हैं:
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
मंच।
इसलिए यदि आप चाहते हैं कि दस्तावेज़ कैसे लौटाया जाए, इस पर अधिक नियंत्रण हो, तो एम्बेडेड दस्तावेज़ों के साथ काम करते समय एकत्रीकरण ढांचा इसे करने का तरीका है।