Java mongodb聚合中的查找

Java mongodb聚合中的查找,java,mongodb,spring-mvc,mongodb-query,aggregation-framework,Java,Mongodb,Spring Mvc,Mongodb Query,Aggregation Framework,以下bson是PersonalAddress集合: { "id" : "123456", "name" : "foo", "address" : [ { "local" : "yes", "location" : [ { "place" : {

以下bson是
PersonalAddress
集合:

{ 
        "id" : "123456", 
        "name" : "foo", 
        "address" : [
            {
                "local" : "yes", 
                "location" : [
                   {
                        "place" : {
                            "_id":"VZG", 

                        }, 
                        "place_lat" : "18", 
                        "place_lan" : "83", 

                },
                {
                        "place" : {
                            "name" : "kerala", 
                            "district" : "palakkad", 
                            "pincode" : "5203689", 

                        }, 
                        "place_lat" : "18", 
                        "place_lan" : "83",      
                    }
                ]
            }
        ]
    } 
我有另一个
places
收藏:

 {
     "_id":"VZG",
     "name" : "vizag", 
     "district" : "Visakhaptanam, 
     "pincode" : "568923",
 }
使用mongodb聚合中的查找功能,我想将
places
collection嵌入
PersonalAddress
collection中

我试着用

Aggregation aggregation = newAggregation(lookup("places", "address.location.place._id", "_id", "myplaces"), unwind("myplaces"));

AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(aggregation, PersonAddressDocument.class, OutputDocument.class);
Aggregation-Aggregation=newAggregation(查找(“地点”、“地址.位置.地点._-id”)、“_-id”、“我的地点”)、展开(“我的地点”);
AggregationResults=mongoTemplate.aggregate(聚合,PersonalAddressDocument.class,OutputDocument.class);

有人能帮我吗

由于您有嵌套数组,您需要首先应用操作符,以便在使用管道之前对嵌入的文档进行反规范化(除非您在聚合操作中已将其展平):

然后可以实现为(未经测试):

然后将该操作作为聚合管道中的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
);
Aggregation agg=newAggregation(
解除(“地址”),
展开(“地址、位置”),
查找操作
);
AggregationResults=mongoTemplate.aggregate(
agg,PersonAddressDocument.class,OutputDocument.class
);

非常感谢
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);
    }
}
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
);
db.productgroups.aggregate([
    // Unwind the source
    { "$unwind": "$products" },
    // Do the lookup matching
    { "$lookup": {
       "from": "products",
       "localField": "products",
       "foreignField": "_id",
       "as": "productObjects"
    }},
    // Unwind the result arrays ( likely one or none )
    { "$unwind": "$productObjects" },
    // Group back to arrays
    { "$group": {
        "_id": "$_id",
        "products": { "$push": "$productObjects" },
    }}
])