gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:29:14 25 4
gpt4 key购买 nike

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

就这样吧……

我有 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 集合中具有 name value = "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 接口(interface)来完成同样的事情。这是我使用 MongoOperations 接口(interface)的代码:

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 接口(interface)。

最佳答案

经过一番搜索并查看源代码后,我意识到我需要将 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());

关于mongodb - 使用spring data mongodb删除对象中的数组条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12054133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com