在Spring的MongoDB中以@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);
他们都没有工作,我完全一无所知。
答案 0 :(得分: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
答案 1 :(得分:1)
查找:
使用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);