【问题标题】:I want to update values ​in an array in an array while using MongoTemplate我想在使用 MongoTemplate 时更新数组中的值
【发布时间】:2021-12-29 06:18:01
【问题描述】:

首先,我将显示存储在mongodb 中的状态。

如您所见,它是一个结构,其中包含一个名为replies 的列表,位于一个名为comments 的列表中。在replies 内部有一个名为likes 的数组。

comments : [
    Object1 : {
        replies : [ 
            likes : [
                0 : {},
                1 : {}
            ]
        ]
    },
    Object2 : {
        replies : [
            likes : [
                0 : {},
                1 : {}
            ]
        ]
    }
]

我在这里要做的是仅从特定replies 结构内的likes 数组中插入/减去一个值。我目前正在使用 Spring Boot,并尝试了以下方法:

        Query query = new Query();
        Criteria criteria = Criteria.where("_id").is(new ObjectId(postId))
                .andOperator(Criteria.where("comments")
                                .elemMatch(Criteria.where("_id").is(new ObjectId(commentId))
                                        .andOperator(Criteria.where("replies")
                                                .elemMatch(Criteria.where("_id").is(new ObjectId(replyId)))
                                        )
                                )
                );

        query.addCriteria(criteria);

        Update update = new Update();
        if (state) {
            // remove user id 
            update.pull("comments.$[].replies.$.likes", new ObjectId(userId));
        } else {
            // add user id 
            update.push("comments.$[].replies.$.likes").value(new ObjectId(userId));
        }
        mongoTemplate.updateFirst(query, update, MyEntity.class);

根据布尔值state添加或删除userId的操作。作为尝试的结果,最多找到一个特定的comment,但userId 无条件地进入commentreplies 列表的第一个likes 列表中。我想要的是进入特定reply 内的likes 列表。我在update.push() 中使用了错误的参数吗?如果您能告诉我如何解决它,我将不胜感激。

【问题讨论】:

    标签: spring-boot mongotemplate criteriaquery


    【解决方案1】:

    由于我对 spring 的标准构建器没有经验,因此无法直接回答您的问题,但以下是您在 mongo 中直接执行此操作的方法,这可能会帮助您弄清楚:

    您可以定义arrayfilters,以便跟踪每个commentsreplies 的相应索引。然后,您可以使用这些索引在完全匹配的索引处推送新对象:

    db.collection.update({
      _id: "<postId>"
    },
    {
      $push: {
        "comments.$[comments].replies.$[replies].likes": {
          _id: "newlyInsertedLikeId"
        }
      }
    },
    {
      arrayFilters: [
        {
          "comments._id": "<commentId>"
        },
        {
          "replies._id": "<replyId>"
        }
      ]
    })
    

    这是 mongoplayground 上的一个示例:https://mongoplayground.net/p/eNdDXXlyi2X

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-15
      • 2020-09-04
      • 2015-12-20
      • 2023-01-06
      • 2020-04-15
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多