Mongodb的 mongoTemplate 内嵌文档怎么进行查询?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb的 mongoTemplate 内嵌文档怎么进行查询?相关的知识,希望对你有一定的参考价值。

这是我的数据结构--三层;通过第一层zcxx01=che 能查询到所有的数据
但是 通过 第三层 goodsCode=8888888 就不能用这个方法了??
这是我写的 zcxx01能查询,我想要的是 怎么通过goodsCode来查询所有。我改怎么写,求救啊

参考技术A 1
2
3
4
5

Criteria criteria = new Criteria().andOperator(
Criteria.where("createDate").gte(dateFormat.parseObject("2014-10-01 00:00:00")),
Criteria.where("createDate").lt(dateFormat.parseObject("2014-11-01 00:00:00"))
);
mongoTemplate.group(criteria, "collectionName", new GroupBy("GroupField"), entityClass);

1
2
3
4
5

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.12.3</version>
</dependency>

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

【中文标题】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的 mongoTemplate 内嵌文档怎么进行查询?的主要内容,如果未能解决你的问题,请参考以下文章

没有名为“mongoTemplate”的 bean 可用。 Spring Boot + MongoDB

mongodb-mongotemplate进行地理坐标操作

MongoDB Lifecycle 事件访问 MongoTemplate

MongoDB 用MongoTemplate查询指定时间范围的数据

MongoTemplate 操作 mongodb

mongoTemplate聚合操作Demo