以下bson是personaddress集合:{ id : 123456, name : foo, address : [{local : yes, location : [{place : {_id:VZG, }, place_lat : 18, place_lan : 83, },{place : {name : ...
![](https://oss.womengda.net/imgfile/2310/1ER061c2QZ-41M2.jpg)
以下bson是personaddress集合:
{
"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",
}
]
}
]
}
我有另一个地方集合:
{
"_id":"VZG",
"name" : "vizag",
"district" : "Visakhaptanam,
"pincode" : "568923",
}
在mongodb聚合中使用lookup,我想在personaddress集合中嵌入places集合
我试过用
Aggregation aggregation = newAggregation(lookup("places", "address.location.place._id", "_id", "myplaces"), unwind("myplaces"));
AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(aggregation, PersonAddressDocument.class, OutputDocument.class);
谁能帮我?
解决方法:
由于您具有嵌套数组,因此在使用$lookup管道之前,需要首先应用$unwind运算符以使嵌入文档非规范化(除非您已在聚合操作中将它们展平):
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
);
如果您的Spring Data版本不支持此功能,则解决方法是实现AggregationOperation接口以接收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
);
沃梦达教程
本文标题为:java – 在mongodb聚合中查找
![](/xwassets/images/pre.png)
![](/xwassets/images/next.png)
猜你喜欢
- 详解springcloud组件consul服务治理 2023-04-12
- SpringCloud通过Nacos实现注册中心与远程服务调用详解流程 2023-02-28
- 简单聊聊工作中常用的Java Lambda表达式 2023-07-01
- Java中mybatis的三种分页方式 2023-04-12
- Tomcat启动成功访问主页失败的原因解决方案 2023-07-31
- MyBatis-Plus多表联查(动态查询)的项目实践 2023-04-07
- SpringBoot DataSource数据源实现自动配置流程详解 2023-06-06
- 一文了解jJava中的加密与安全 2023-03-15
- JSP 开发SSH整合异常解决办法 2023-08-01
- java高并发ScheduledThreadPoolExecutor与Timer区别 2023-06-10