MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate
Posted
技术标签:
【中文标题】MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate【英文标题】:MongoDB $addFields using org.springframework.data.mongodb.core.MongoTemplate 【发布时间】:2019-03-21 14:13:06 【问题描述】:如何在 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"
]
);
在第一个添加字段中,我只是使用现有对象字段之一创建一个新数组字段。
在第二个添加字段中,做同样的事情,但在文档的数组中的一个对象内。
【问题讨论】:
【参考方案1】:像match/unwind
一样,spring data mongo
中不存在 AddFieldOperation 但您可以编写自己的类以及custom Aggregation
类来将调用方方法添加到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);
现在制作 CustomAggregation 类。
public class CustomAggregation extends Aggregation
public static AddFieldOperation addField(final Document document)
return new AddFieldOperation(document);
一切准备就绪,您需要调用Addfield
方法并传递 Document 对象示例中的所有查询:-
AddFieldOperation addField =
CustomAggregation.addField(new Document().append("fieldName", fieldValue));
注意Document
类来自import package org.bson.Document
;
将文档表示为 @code Map。
在spring data mongo
中实现的所有聚合操作最终都转换为 Document 对象,这将在 shell 中执行。因此,如果某些聚合管道尚未在 spirng data
中实现,在这种情况下,我们可以编写自己的并传递用 mongo shell 编写的查询,我们可以将其传递到 Document 对象中。
【讨论】:
我们要向其附加字段的new Document()
是什么?我想对整个集合运行我的查询。
我明白org.bson.Document
是什么。我的意思是问new Document()
在这里的上下文价值是什么。您能否将value
的第一个添加字段existingObjectField.newFieldArray
和第二个添加字段existingFieldArray
(在我的MongoDB 查询中)的部分放在您的示例中进行演示?以上是关于MongoDB $addFields 使用 org.springframework.data.mongodb.core.MongoTemplate的主要内容,如果未能解决你的问题,请参考以下文章