当前位置: 首页 > 知识库问答 >
问题:

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

韶英达
2023-03-14
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中编写的代码使用Spring数据mongo条件查询,

    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的total number of replies更新字段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
    }],
}

我完全搞不清在哪里做这个操作,同时拿取。

共有1个答案

单于奇略
2023-03-14

您需要执行MongoDB聚合。

  1. 我们应用$match阶段筛选结果(类似于.find(查询))
  2. 我们应用$project转换文档结构,并包含基于replies值计算的totalreplies字段
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);
project("_id", "_class", "replies")
        .and(AggregationFunctionExpressions.SIZE
            .of(new BasicDBObject("$filter",
                new BasicDBObject("input", "$replies.status")
                    .append("as", "status")
                    .append("cond", "$$status"))))
        .as("totalReplies")
 类似资料:
  • 我有一个索引(名称:“index1”)指向ElasticSearch中的多个文档。 文档的格式(json)是- 下面是映射- 我在ES查询中哪里做错了?

  • 换言之,我试图找出Firestore在SQL中与此等效的是什么: 是的,我问的是如何一次更新多个文档,但与链接的问题不同,我特别问的是如何一次更新多个文档,而不将任何内容读入内存,因为当您只想在所有匹配条件的文档上设置一个标志时,不需要这样做。 这就是我期望的工作方式,集合参考没有方法。 Transactions and Batched Writes文档提到了事务和批处理写入。事务被淘汰是因为“一

  • 为了在Lucene查询返回的文档中显示突出显示的匹配词,Lucene搜索结果可能包含用于将文档作为匹配我的请求返回的词。 例如: > Lucene查询:"狗猫" 结果:[“狗很好”,“狗和猫是朋友”] 如何通过Lucene实现这一点?我无法手动处理猫或狗,也无法处理请求词和返回词之间的任何差异。

  • 本文向大家介绍MongoDB中一次查询更新多个文档,包括了MongoDB中一次查询更新多个文档的使用技巧和注意事项,需要的朋友参考一下 要通过单个查询更新许多文档,请在MongoDB中使用 bulkWrite()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用MongoDB中的一个查询来更新许多文档的查询- 在find()方法的帮助

  • 本文向大家介绍根据两个条件更新MongoDB中指定字段的查询,包括了根据两个条件更新MongoDB中指定字段的查询的使用技巧和注意事项,需要的朋友参考一下 为此,请使用UPDATE()方法,并在其中设置两个条件。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出; 以下是根据两个条件更新MongoDB中数量的查询- 在find()方法的帮助下显示集合

  • 我正在用以下查询查询我的索引: 字段是字符串数组,查询的工作方式与预期相同。然而,有些文档没有字段,我也希望获得这些文档。 我怎么能那么做?