在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects
Posted
技术标签:
【中文标题】在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects【英文标题】:Use $mergeObjects inside ReplaceRoot pipeline stage in Spring MongoDB 【发布时间】:2019-03-06 17:32:02 【问题描述】:我希望将此片段复制到 Java 代码中:
db.getCollection('admins_comptes_client_ceov4').aggregate([
$lookup: from: "contrats_ceov4",localField: "CUSTOMERNUMBER",foreignField: "CUSTOMERNUMBER",as: "arrayForeignObject"
$unwind: path: "$arrayForeignObject", preserveNullAndEmptyArrays: true,
$replaceRoot: newRoot: $mergeObjects: [ "$arrayForeignObject", "$$ROOT" ] ,
$project: "arrayForeignObject": 0, "_id": 0 ,
$out: "aggregate" ])
到目前为止我在这里:
AggregationOperation lookup = Aggregation.lookup(fromCollection, localField, toMatchWith, "arrayForeignObject");
AggregationOperation unwind = Aggregation.unwind("arrayForeignObject", true);
AggregationOperation replaceRoot = Aggregation.replaceRoot(Aggregation.ROOT);
AggregationOperation project = Aggregation.project("arrayForeignObject").andExclude("_id");
AggregationOperation out = Aggregation.out("aggregate");
Aggregation aggregation = Aggregation.newAggregation(lookup, replaceRoot, unwind, project, out);
mongoTemplate.aggregate(aggregation, initialCollection, AggregateModel.class);
我对以下几点有疑问:
$replaceRoot: newRoot: $mergeObjects: [ "$arrayForeignObject", "$$ROOT" ]
我无法成功创建合并对象。
使用以下 java sn-p,AggregationOperation 的结果是:
"$replaceRoot" : "newRoot" : "$arrayForeignObject"
当我执行这个 java sn-p 时,我最终得到了一个新集合,里面只有一个外部数组和一个 _id 字段。
有没有人已经遇到过这个问题,可以帮忙吗? 弗里格0
【问题讨论】:
【参考方案1】:这里有几个问题。使用 2.1.0 Release Spring Mongodb jar。
AggregationOperation replaceRoot = Aggregation.replaceRoot().withValueOf(ObjectOperators.valueOf("arrayForeignObject").mergeWith(Aggregation.ROOT));
AggregationOperation project = Aggregation.project().andExclude("_id", "arrayForeignObject");
Aggregation aggregation = Aggregation.newAggregation(lookup, unwind, replaceRoot, project, out);
对于spring mongodb的低版本
AggregationOperation replaceRoot = ReplaceRootOperation.builder().withDocument("$mergeObjects", Arrays.asList("$arrayForeignObject", Aggregation.ROOT));
AggregationOperation project = Aggregation.project().andExclude("_id", "arrayForeignObject");
Aggregation aggregation = Aggregation.newAggregation(lookup, unwind, replaceRoot, project, out);
【讨论】:
因为我必须使用以上是关于在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects的主要内容,如果未能解决你的问题,请参考以下文章
如何在 spring-boot 中禁用 spring-data-mongodb 自动配置
spring mongodb updatemulti为啥只更新了一条
[Carefree MongoDB] Spring Boot MongoDB 自动化配置