带有Spring Data的MongoDB通过id在数组中查找对象

时间:2016-02-05 08:55:09

标签: java mongodb spring-data spring-data-mongodb

我将Spring Data与Mongo DB嵌入式数据库一起使用,并具有以下文档结构:

{
  id : 111
  messaage : abcd
  commentsList: [
                  {
                    id : 123
                    text: test text
                    numberOfLikes : 5
                    numberOfDislikes: 2
                  }
                ]     
}

我正在尝试通过id获取注释并将numberOfLikes字段更新为1并且似乎无法使其工作,这是我尝试过的以及java类结构:

public class Post {

    private String id;
    private String message;
    private List<Comment> commentsList = new ArrayList<>();
    ...
}

public class Comment {

    private String id;
    private String text;
    private int numberOfLikes;
    private int numberOfDislikes;

    ...
}

Query query = new Query();
query.addCriteria(Criteria.where("commentsList._id").is("123"));
List<MongoComment> commentList = mongoTemplate.find(query, MongoComment.class);

目前返回的列表始终为null。

2 个答案:

答案 0 :(得分:0)

数组中元素的ID&#34; commentsList&#34;是&#34; id&#34; (没有&#39; _&#39;)。

query.addCriteria(Criteria.where("commentsList.id").is("123"))

这应该有效。

&#34; _id&#34;您尝试查询的是Mongodb为每个文档自动生成的标识符。您在数据库中的文档如下所示:

{
  _id: ObjectId("56b46e1d1d1353e38886dcc34f"),
  id : 111,
  messaage : "abcd",
  commentsList: [
                  {
                    id : 123,
                    text: "test text",
                    numberOfLikes : 5,
                    numberOfDislikes: 2
                  }
                ]     
    }

答案 1 :(得分:0)

由于您试图通过id获取评论并将numberOfLikes字段更新为1,因此您基本上希望复制此mongo shell更新操作:

db.post.update(
    { "commentsList.id": "123" },
    {
        "$inc": { "commentsList.$.numberOfLikes": 1 }
    }
)

等效的Spring Data MongoDB代码如下:

import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query;
import static org.springframework.data.mongodb.core.query.Update;

...

WriteResult wr = mongoTemplate.updateMulti(
    new Query(where("commentsList.id").is("123")),
    new Update().inc("commentsList.$.numberOfLikes", 1),
    MongoPost.class
);