किसी विशेष व्यक्ति दस्तावेज़ के लिए, आप populate()
. का उपयोग कर सकते हैं
var query = mongoose.model("person").find({ "name": "foo" }).populate("projects.tags");
और यदि आप उदाहरण के लिए 'मोंगोडीबी' या 'नोड जेएस' के साथ कोई टैग रखने वाले किसी भी व्यक्ति की खोज करना चाहते हैं, तो आप populate()
में क्वेरी विकल्प शामिल कर सकते हैं। फ़ंक्शन अधिभार के रूप में:
var query = mongoose.model("person").find({ "name": "foo" }).populate({
"path": "projects.tags",
"match": { "en": { "$in": ["MongoDB", "Node JS"] } }
});
यदि आप चाहते हैं कि सभी टैग "project.tags"
. में मौजूद हों सभी व्यक्तियों के लिए, तो एकत्रीकरण ढांचा जाने का रास्ता है। इस पाइपलाइन को व्यक्ति संग्रह पर चलाने पर विचार करें और $lookup
. का उपयोग करें टैग संग्रह पर बाईं ओर शामिल होने के लिए ऑपरेटर:
mongoose.model('person').aggregate([
{ "$unwind": "$projects" },
{ "$unwind": "$projects.tags" },
{
"$lookup": {
"from": "tags",
"localField": "projects.tags",
"foreignField": "_id",
"as": "resultingTagsArray"
}
},
{ "$unwind": "$resultingTagsArray" },
{
"$group": {
"_id": null,
"allTags": { "$addToSet": "$resultingTagsArray" },
"count": { "$sum": 1 }
}
}
]).exec(function(err, results){
console.log(results);
})
किसी विशेष व्यक्ति के लिए $match
. लागू करें दस्तावेज़ों को फ़िल्टर करने के पहले चरण के रूप में पाइपलाइन:
mongoose.model('person').aggregate([
{ "$match": { "name": "foo" } },
{ "$unwind": "$projects" },
{ "$unwind": "$projects.tags" },
{
"$lookup": {
"from": "tags",
"localField": "projects.tags",
"foreignField": "_id",
"as": "resultingTagsArray"
}
},
{ "$unwind": "$resultingTagsArray" },
{
"$group": {
"_id": null,
"allTags": { "$addToSet": "$resultingTagsArray" },
"count": { "$sum": 1 }
}
}
]).exec(function(err, results){
console.log(results);
})
एक अन्य समाधान यदि आप MongoDB संस्करण>=2.6 या <=3.0 का उपयोग कर रहे हैं जिसमें $lookup
के लिए समर्थन नहीं है ऑपरेटर को परिणामों को एकत्रीकरण के रूप में पॉप्युलेट करना है:
mongoose.model('person').aggregate([
{ "$unwind": "$projects" },
{ "$unwind": "$projects.tags" },
{
"$group": {
"_id": null,
"allTags": { "$addToSet": "$projects.tags" }
}
}
], function(err, result) {
mongoose.model('person')
.populate(result, { "path": "allTags" }, function(err, results) {
if (err) throw err;
console.log(JSON.stringify(results, undefined, 4 ));
});
});