चूंकि आपके पास नेस्टेड सरणियाँ हैं, इसलिए आपको $unwind
. लागू करने की आवश्यकता है $lookup
. का उपयोग करने से पहले एम्बेडेड दस्तावेज़ों को सामान्य बनाने के लिए पहले ऑपरेटर पाइपलाइन (जब तक कि आपने उन्हें अपने एकत्रीकरण ऑपरेशन में पहले ही समतल नहीं कर दिया है):
db.personaddress.aggregate([
{ "$unwind": "$address" },
{ "$unwind": "$address.location" },
{
"$lookup": {
"from": "places",
"localField": "address.location.place._id",
"foreignField": "_id",
"as": "address.location.place",
}
}
])
जिसे तब (अनचाहे) के रूप में लागू किया जा सकता है:
LookupOperation lookupOperation = LookupOperation.newLookup()
.from("places")
.localField("address.location.place._id")
.foreignField("_id")
.as("address.location.place");
Aggregation agg = newAggregation(
unwind("address"),
unwind("address.location"),
lookupOperation
);
AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
agg, PersonAddressDocument.class, OutputDocument.class
);
यदि आपका स्प्रिंग डेटा संस्करण इसका समर्थन नहीं करता है, तो एग्रीगेशनऑपरेशन को लागू करने का समाधान है DBObject
में लेने के लिए इंटरफ़ेस :
public class CustomGroupOperation implements AggregationOperation {
private DBObject operation;
public CustomGroupOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
फिर $lookup
. लागू करें एकत्रीकरण पाइपलाइन में DBObject के रूप में संचालन:
DBObject lookupOperation = (DBObject)new BasicDBObject(
"$lookup", new BasicDBObject("from", "places")
.append("localField", "address.location.place._id")
.append("foreignField", "_id")
.append("as", "address.location.place")
);
जिसे आप तब उपयोग कर सकते हैं:
Aggregation agg = newAggregation(
unwind("address"),
unwind("address.location"),
lookupOperation
);
AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
agg, PersonAddressDocument.class, OutputDocument.class
);