使用spring data mongodb删除对象中的数组条目

ufa*_*oli 5 mongodb spring-data

我最近花了一些时间尝试$pull通过Spring的Data MongoOperations接口使用运算符,所以我认为如果有人碰到类似的问题,分享我的发现会很好.

所以这里......

我有2个java POJO,如下所示:

@Document
public class OutterObject{

    private String id;
    private String name;
    private List<InnerDocument> innerDocs;


    //SETTERS - GETTERS Ommited


public class InnerDocument{


    private String id;
    private String name;

         //SETTERS - GETTERS Ommited
Run Code Online (Sandbox Code Playgroud)

这存储在Mongo集合中,如下所示:

 "_id" : "doc2",
 "_class" : "OutterObject",
 "name" : "doc2",
 "innerDocs" : [{
      "_id" : "innerDoc21",
      "name" : "innerDoc21"
  }, {
      "_id" : "innerDoc22",
      "name" : "innerDoc22"
  }]
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用$ pull运算符来删除具有名称值="innerDoc22"的innerDoc集合中的所有对象.

我知道如何使用mongo驱动程序完成此操作,如下所示:

 List<String> ids = 
         Arrays.asList("innerDoc22");

 BasicDBObject find = new BasicDBObject();

 match.put("innerDocs.name", 
           BasicDBObjectBuilder.start("$in", ids).get());

    BasicDBObject update = new BasicDBObject();
        update.put(
                "$pull",
                BasicDBObjectBuilder.start("innerDocs",
                        BasicDBObjectBuilder.start("name", "innerDoc22").get()).get());

  DBCollection col= mongoOperations.getDb().getCollection("outterObject");

  col.update(find , update);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Spring的MongoOperations接口完成同样的事情.这是我使用MongoOperations接口的代码:

List<String> ids = Arrays.asList("innerDoc22");

Query removeQuery = Query.query(Criteria.where("innerDocs.name").in(ids));

WriteResult wc = mongoOperations.upsert(
                    removeQuery, 
                    new Update().pull("innerDocs.name", "innerDoc22"), 
                    OutterObject.class);
System.out.println(wc.getLastError());
Run Code Online (Sandbox Code Playgroud)

在调用getLastError()更新时,我没有收到任何错误,只是没有在数据库中完成.

我知道这里已经提出了类似的问题但是给出的答案并没有使用MongoOperations接口.

ufa*_*oli 5

经过一番搜索并查看源代码后,我意识到我需要将 InnerDocument 对象作为第二个参数传递给 pull 方法,以便 spring 类能够正确进行映射。

事实证明,我可以在选择对象时导航对象(我在removeQuery中使用“innerDocs.name”),但在更新文档时我不能(或没有找到方法)执行相同的操作。

以下是我如何使用 MongoOperations 实现查询:

List<String> ids = Arrays.asList("innerDoc22", "innerDoc21");

Query removeQuery = Query.query(Criteria.where("innerDocs.name").in(ids));

WriteResult wc = 
       mongoOperations.upsert(removeQuery, 
           new Update().pull("innerDocs", 
           new InnerDocument("innerDoc22", null)), 
           OutterObject.class);

System.out.println(wc.getLastError());
Run Code Online (Sandbox Code Playgroud)

  • 这个[http://stackoverflow.com/a/27153010/234110]对我来说效果更好,因为 _class 在我的例子中造成了一个问题。 (2认同)