在 MongoDB for Spring 中的 @DBref 列表项中查找/删除
Posted
技术标签:
【中文标题】在 MongoDB for Spring 中的 @DBref 列表项中查找/删除【英文标题】:Find/Remove in @DBref list items in MongoDB for Spring 【发布时间】:2019-03-27 16:01:02 【问题描述】:在 MongoDB for Spring 中查找和更新嵌套列表项为 @DBRef
的最佳方法是什么?
我有一个 AppliedApplication 类:
@Document(collection = "applied_application")
public class AppliedApplication
@Id
private String id;
@Field("program")
@DBRef
private List<Program> programList;
// getters and setters
Program 类为@DBRef
:
@Document(collection = "program")
public class Program
@Id
private String id;
@Field("program_name")
private String programName;
// getters and setters
我正在寻找一种使用以下查询来查找和更新嵌套列表项的方法:
用于通过 AppliedApplication 集合中的 Id 查找 Program 对象的查询:
Query query = new Query();
query.addCriteria(Criteria.where("id").is(applicationId)
.and("program.$id").is(new ObjectId(programId)));
Program program = mongoTemplate.findOne(query, Program.class);
用于从 AppliedApplication 中删除列表项的查询:
Update update = new Update().pull("program", new BasicDBObject("program.$id", new ObjectId(programId)));
mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class);
他们都没有工作,我完全一无所知。
【问题讨论】:
【参考方案1】:如果您返回 AppliedApplication,则将运行第一个查询
Query query = new Query();
query.addCriteria(Criteria.where("id")
.is(new ObjectId(applicationId))
.and("program.$id")
.is(new ObjectId(programId)));
AppliedApplication application = this.mongoOperations.findOne(query, AppliedApplication .class);
然后使用应用程序对象获取程序。
对于您需要更改的第二个查询,
Update update = new Update().pull("program", new BasicDBObject("$id", new ObjectId(programId)));
mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class);
替换 --> abc.$id 为 $id
【讨论】:
对于第二个查询,您需要添加更改查询对象,如下所示,Update update = new Update().pull("program", new BasicDBObject("program.$id", new ObjectId(programId) )));查询查询 = 新查询(); query.addCriteria(Criteria.where("id") .is(new ObjectId(applicationId)) .and("program.$id") .is(new ObjectId(programId))); mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class); 如何推回列表中的一个项目?【参考方案2】:查找:
使用positional operator
/$elemMatch
在 AppliedApplication 中查找匹配的 Program DBRef。
使用$positional
投影
Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId(applicationId)).and("program.$id").is(new ObjectId(programId)));
query.fields().position("program", 1);
AppliedApplication application = mongoTemplate.findOne(query, AppliedApplication.class);
Program program = application.getProgramList().get(0);
使用$elemMatch
投影
Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId(applicationId)));
query.fields().elemMatch("program", Criteria.where("$id").is(new ObjectId(programId)));
AppliedApplication application = mongoTemplate.findOne(query, AppliedApplication.class);
Program program = application.getProgramList().get(0);
删除:
使用$pull
从程序 DBref 的列表中删除 DBRef。
Query query = Query.query(Criteria.where("$id").is(new ObjectId(programId)));
Update update = new Update().pull("program", query);
mongoTemplate.updateMulti(new Query(), update, AppliedApplication.class);
添加
使用$push
将新程序添加到列表中。
Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId(applicationId)));
Update update = new Update().push("program", new DBRef("program", new ObjectId(programId));
mongoTemplate.updateMulti(query, update, AppliedApplication.class);
【讨论】:
如何推回列表中的一个项目? 更新答案。 我有这样的东西: Query queryPromotion = Query.query(Criteria.where(ID).is(promotionId)); List以上是关于在 MongoDB for Spring 中的 @DBref 列表项中查找/删除的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?
使用Spring Data防止MongoDB中的重复(Spring Roo)