【发布时间】:2012-08-21 11:46:08
【问题描述】:
我最近花了一些时间尝试通过 Spring 的 Data MongoOperations 接口使用 $pull 运算符,所以我认为如果有人遇到类似问题,分享我的发现会很好。
就这样吧……
我有 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
这像这样存储在 Mongo 集合中:
"_id" : "doc2",
"_class" : "OutterObject",
"name" : "doc2",
"innerDocs" : [{
"_id" : "innerDoc21",
"name" : "innerDoc21"
}, {
"_id" : "innerDoc22",
"name" : "innerDoc22"
}]
我正在尝试使用 $pull 运算符来删除 innerDoc 集合中名称值为“innerDoc22”的所有对象。
我知道如何使用 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);
我正在尝试使用 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());
我在调用getLastError() 时没有收到任何错误,数据库中根本没有完成更新。
我知道here 已经有人问过类似的问题,但给出的答案没有使用 MongoOperations 界面。
【问题讨论】:
标签: mongodb spring-data