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的主要内容,如果未能解决你的问题,请参考以下文章

带有 $cond 的 MongoDB 聚合管道 $addFields - 无法使用变量

MongoDB $addFields,根据条件添加布尔字段

没有找到 $match 时的 $addFields

MongoDB添加字段取决于名称?

MongoDB:使用嵌套的 $group 聚合

MongoDB心得