在 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 商店 = shopIds.stream().map(shopId -> new DBRef("shop", shopId)) .collect(Collectors.toList());更新 update = new Update().push("shops").each(shops); mongoTemplate.updateFirst(queryPromotion, update, PromotionDto.class);但它不起作用:(

以上是关于在 MongoDB for Spring 中的 @DBref 列表项中查找/删除的主要内容,如果未能解决你的问题,请参考以下文章

在spring mongodb查询中指定多个标准

Spring Data MongoDB 和 Hibernate OGM for MongoDB 有啥区别?

使用Spring Data防止MongoDB中的重复(Spring Roo)

基于spring boot的项目中的spring data mongodb配置

Spring中的连接错误,使用Mongodb休眠

通过 spring-data 迭代 MongoDB 中的大型集合