如何在Spring Data MongoDB Reactive中编写一个$addFields
查询,以实现更简单和稍微复杂的字段添加,如下所示:
db.getCollection("mycollection").aggregate(
[
{
"$addFields" : {
"existingObjectField.newFieldArray" : [
"$existingObjectField.existingFieldObject"
]
}
},
{
"$addFields" : {
"existingFieldArray" : {
"$map" : {
"input" : "$existingFieldArray",
"as" : "item",
"in" : {
"existingFieldObject" : {
"_id" : "$$item. existingFieldObject._id",
"newFieldArray" : [
"$$item. existingFieldObject.existingFieldObject"
]
}
}
}
}
}
},
{
"$out" : "mycollection"
}
]
);
在第一个添加字段中,我只是使用现有对象字段之一创建一个新的数组字段。
在第二个添加字段中,执行相同操作,但在文档数组中的对象内。
答案 0 :(得分:2)
类似于#myframe{
pointer-events:none;
}
的{{1}}中不存在AddFieldOperation,但是您可以编写自己的类,也可以编写一个match/unwind
类,以将调用者方法添加到spring data mongo
中,如下所示。
custom Aggregation
现在创建CustomAggregation类。
addFieldOpration
一切准备就绪,您需要调用 public class AddFieldOperation implements AggregationOperation {
private final Document document;
/**
* Creates a new {@link MatchOperation} for the given {@link CriteriaDefinition}.
*
* @param criteriaDefinition must not be {@literal null}.
*/
public AddFieldOperation(final Document document) {
Assert.notNull(document, "Criteria must not be null!");
this.document = document;
}
/*
* (non-Javadoc)
*
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDocument(org.
* springframework.data.mongodb.core.aggregation.AggregationOperationContext)
*/
@Override
public Document toDocument(final AggregationOperationContext context) {
return new Document("$addFields", this.document);
}
}
方法并在Document对象示例中传递所有查询:-
public class CustomAggregation extends Aggregation {
public static AddFieldOperation addField(final Document document) {
return new AddFieldOperation(document);
}
}
注意
Addfield
类来自AddFieldOperation addField =
CustomAggregation.addField(new Document().append("fieldName", fieldValue));
;
这是文档作为{@code Map}的表示形式。
在Document
中实现的所有聚合操作最终都将转换为Document对象,并将在shell中执行。因此,如果某些聚合管道尚未在import package org.bson.Document
中实现,那么在这种情况下,我们可以编写自己的并传递在mongo shell中编写的查询,我们只需在Document对象中传递它即可。