使用org.springframework.data.mongodb.core.MongoTemplate的MongoDB $ addFields

时间:2019-03-21 14:13:06

标签: mongodb spring-data-mongodb

如何在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 个答案:

答案 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对象中传递它即可。