使用Spring Data Mongo中的条件查询来获取结果时,更新文档中的字段之一

卡尔提克

使用条件查询,我正在从MongoDB中获取文档。我在这里的要求是,我想通过使用Spring Data Mongo中的Criteria查询子文档来通过上级文档值更新字段。父文档是注释,嵌套文档是答复。我可以使用以下代码获取评论列表以及子文档,

Data Set:
{
"_id" : ObjectId("5cb726937a7148376094d393"),
"_class" : "vzi.cpei.Comments",
"text" : "first comment on money control",
"replies" : [        
    {
        "_id" : "3cfef1cd-e0da-4883-86a4-17b223639087",
        "text" : "extract the traces",
        "status" : true
    },
    {
        "_id" : "3cfef1cd-e0da-4883-86a4-17b153690087",
        "text" : "replied deiberate",
        "status" : false
    },
    {
        "_id" : "3cfef1cd-e0da-4883-86a4-17b153139087",
        "text" : "Bgm",
        "status" : true
    }],
}
Response DTO:
      
      public class CommentsDTO{
      private String id;
      private String text;
      private List<Replies> replies;
      private Integer totalReplies;
    }

使用Spring数据mongo Criteria查询在Spring中编写的代码,

    Query query = new Query();
    Criteria criteria =Criteria.where("_id").is(new ObjectId("5efe3d1f8a2ef008249f72d9"));
    query.addCriteria(criteria);
    List<Comments> comments = mongoOps.find(query,"Comments", 
  CommentsDTO.class);
    return comments;

在结果中,我想用状态为true的总答复数更新字段repliesCount,因此预期输出应为,

{
"_id" : ObjectId("5cb726937a7148376094d393"),
"_class" : "vzi.cpei.Comments",
"text" : "first comment on money control",
"totalReplies" : 2
"replies" : [        
    {
        "_id" : "3cfef1cd-e0da-4883-86a4-17b223639087",
        "text" : "extract the traces",
        "status" : true
    },
    {
        "_id" : "3cfef1cd-e0da-4883-86a4-17b153690087",
        "text" : "replied deiberate",
        "status" : false
    },
    {
        "_id" : "3cfef1cd-e0da-4883-86a4-17b153139087",
        "text" : "Bgm",
        "status" : true
    }],
}

我完全困惑在获取时在哪里执行此操作。

瓦利洪

您需要执行MongoDB聚合

的解释 pipeline

  1. 我们将该$match阶段应用于过滤结果(类似于.find(query)
  2. 我们应用$project来转换文档结构,并包含totalReplies基于replies计算的字段

贝壳

db.Comments.aggregate([
  {
    $match: {
      "_id": ObjectId("5cb726937a7148376094d393")
    }
  },
  {
    $project: {
      _class: 1,
      replies: 1,
      totalReplies: {
        $size: {
          "$filter": {
            input: "$replies.status",
            as: "status",
            cond: "$$status"
          }
        }
      }
    }
  }
])

蒙哥运动场

春季蒙哥

import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.ArrayOperators;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
...

Aggregation agg = Aggregation.newAggregation(
        match(Criteria.where("_id").is(new ObjectId("5cb726937a7148376094d393"))),
        project("_id", "_class", "replies").and(ArrayOperators.Size.lengthOfArray(
                ArrayOperators.Filter.filter("replies.status").as("filter").by("$$filter")
                )).as("totalReplies"));

//System.out.println(agg);
return mongoOps.aggregate(agg, mongoOps.getCollectionName(CommentsDTO.class), CommentsDTO.class);

编辑:旧版Spring-boot 1.4.2

project("_id", "_class", "replies")
        .and(AggregationFunctionExpressions.SIZE
            .of(new BasicDBObject("$filter",
                new BasicDBObject("input", "$replies.status")
                    .append("as", "status")
                    .append("cond", "$$status"))))
        .as("totalReplies")

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

spring-data-mongo文档中的计算字段

当使用Spring Data Mongo聚合mongodb中的组时,如何获取具有非空数组字段的元素计数?

我如何使用@Query-> Spring data mongo从@DBRef文档中获取数据

如何使用Spring Data Java在MongoDB中更新嵌套文档

Spring Data Mongo-在嵌入式文档中应用唯一的组合字段

如何使用 Spring Data JPA 更新实体中的集合字段?

Spring Data Mongo在查询中使用OR

如何使用Spring数据从Mongo中的文档数组字段中仅获取匹配结果

使用 Spring 和 Spring Data 更新集合中的对象

使用本机查询时如何在Spring Data Jpa中获取Page<Object[]>之类的东西

使用Spring Data在Mongo DB中展开和拆分多个子文档

使用Spring Data在$ project MongoDB中的$ filter

Spring Data MongoDB使用MongoTemplate从文档中删除属性

使用Spring Data JPA的Mongodb文档中的PrePersist和PreUpdate

如何使用Spring Data Solr在Solr中插入嵌套文档?

如何使用Spring Data从elasticsearch读取文档?

如何使用Spring Data在Mongo中运行JS文件

Spring Data:使用 QueryDSL 谓词查询 DTO

使用Spring Data Jpa获取联接对象

使用Spring Data设置获取大小

使用Spring Data JPA获取NumberFormatException

如何使用Spring Data JPA中的规范获得最佳结果?

如何使用Spring Data MongoDB查询MongoDB文档中的JSON数组

Spring Data JPA(Hibernate):如何仅使用抽象超类中的字段来检索具体实体?

使用Spring Data Rest进行Spring Boot动态查询

ElasticSearch 1.7 (Spring Data ElasticSearch) 按查询更新需要大量时间更新文档

如何使用外键在Spring Data / JPA中执行查询?

同时使用Spring Data Hadoop + Spring MVC时出错

使用spring-data-elasticsearch从索引中获取所有文档