Java mongodb聚合中的查找
以下bson是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" : {
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" },
}}
])