हां ऐसा करने के दो तरीके हैं। तो आप या तो $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) {
कोई भी तरीका पूरी तरह से मान्य है।
यदि आप चाहते हैं कि इसमें कुछ और शामिल हो, तो आप .एग्रीगेट ()
विधि और यह है $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()
में प्रक्षेपण के साथ नहीं किया जा सकता है। ।