如何在Java中实现addFields mongoDB查询

zlwx9yxi  于 2022-11-22  发布在  Go
关注(0)|答案(3)|浏览(327)

我 在 StackOverFlow 找到 了 几 个 与 聚合 中 addFields 相关 的 例子 , 但是 没有 一 个 是 用 Java 实现 的 。

db.getCollection('myDocument').aggregate([
    {$match : {"metaId.ref.uuid" : "d6112808-1ce1-4545-bd52-cf55bc4ed25e"}},
    {$lookup: {
        from: "simple",
        localField: "someId.ref.uuid",
        foreignField: "uuid", 
        as: "simple"}},
    {"$unwind": "$simple"},
    {"$addFields": { "metaId.ref.name" : "$simple.name" }}
])

中 的 每 一 个
我 不能 正确 地 在 Java 中 实现 : - - 没有 得到 正确 的 过程

LookupOperation lookupOperation = LookupOperation.newLookup()
    .from("simple")
    .localField("execId.ref.uuid")
    .foreignField("uuid")
    .as("simple");
Aggregation myDocAggr = new Aggregation(
    match(Criteria.where("metaId.ref.uuid").is(someUUID)), 
    group("uuid").max("version").as("version"),
    lookupOperation,
    Aggregates.unwind(""),
    Aggregates.addFields(fields));
Document document = new Document();
AggregationResults<String> myDocAggrResults =
    mongoTemplate.aggregate(myDocAggr, myDocument, myDocument.class);
List<String> mydocumentList = myDocAggrResults .getMappedResults();

格式
无法 使用 unwind 和 addFields , 这 是 示例 java 代码 , 但 不 太 好 。 请 帮助 我 。 提前 感谢

4smxwvx5

4smxwvx51#

您正在混合Java驱动程序Aggregates方法与Spring Aggregation方法.
此外,$addFields仍然是not supported在 Spring 蒙戈。
您必须使用以下聚合。

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
Aggregation myDocAggr = newAggregation(
       match(Criteria.where("metaId.ref.uuid").is(someUUID)), 
       group("uuid").max("version").as("version"),
       lookup("simple","execId.ref.uuid","uuid","simple"),
       unwind("simple"),
       new AggregationOperation(){ 
         @Override 
         public Document toDocument(AggregationOperationContext aoc) {
            return new Document("$addFields",new Document("metaId.ref.name","$simple.name"));
         }
      }
)
List<Document> mydocumentList=mongoTemplate.aggregate(myDocAggr,"myDocument",Document.class).getMappedResults();
iyfamqjs

iyfamqjs2#

尽管$addFields不被spring mongo支持,你可以自己实现它:

import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.*;
import java.util.LinkedHashMap;
import java.util.Map;

public class AddFieldsOperation implements FieldsExposingAggregationOperation {
    private Map<String, Object> fields = new LinkedHashMap<>();

    public AddFieldsOperation(String field, AggregationExpression expression) {
        addField(field, expression);
    }

    public AddFieldsOperation addField(String field, AggregationExpression expression) {
        this.fields.put(field, expression.toDocument(Aggregation.DEFAULT_CONTEXT));
        return this;
    }

    @Override
    public Document toDocument(AggregationOperationContext context) {
        Document doc = new Document();
        fields.forEach(doc::append);
        return new Document("$addFields", doc);
    }

    @Override
    public boolean inheritsFields() {
        return true;
    }

    @Override
    public ExposedFields getFields() {
        final String[] fieldsArray = fields.keySet().toArray(new String[0]);
        return ExposedFields.synthetic(Fields.fields(fieldsArray));
    }

并像这样使用它:

...
ArithmeticOperators.Add value1 = ArithmeticOperators.Add.valueOf(0);
ArithmeticOperators.Add value2 = ArithmeticOperators.Add.valueOf(0);
AddFieldsOperation addFields
            = new AddFieldsOperation("value1", value1)
            .addField("value2", value2);
pipeline.add(addFields);
...
Add value1PlusValue2 = Add.valueOf("$value1").add("$value2");
...

希望它能帮助到一些人。

f0brbegy

f0brbegy3#

从'spring-data-mongodb'的3.0版本开始,创建AddField聚合实际上是非常容易的。您可以使用AddFieldsOperationBuilder
在下面的示例中,我为objectId字段添加了一个名为_id的字符串ID字段。字符串字段idString可以在查找聚合中使用。
示例:

AddFieldsOperation addFieldsOperation = Aggregation.addFields().addFieldWithValue("idString", ConvertOperators.ToString.toString("$_id")).build();

相关问题