如何使用 MongoDB 和 Spring 的存储库更新列表?

Posted

技术标签:

【中文标题】如何使用 MongoDB 和 Spring 的存储库更新列表?【英文标题】:How do I update a list using MongoDB and Spring's repository? 【发布时间】:2021-12-15 07:24:27 【问题描述】:

我有如下文件:


  myDocument: 
  
     _id: (Auto-generated)
     someField: "Hello world",
     targetField: ["Steve", "Bill"]
  
    

另外,我有一个这样的存储库:

@Repository
public interface FooRepository extends MongoRepository<MyDocument, String> 



我的问题是:“如何在 targetField 中添加新数据而不在本地找到它?因为如果我的列表太大,我不想加载它,而只是插入里面有新的东西。”

谢谢。

【问题讨论】:

【参考方案1】:

spring data mongodb 使用 MongoTemplateQueryUpdate

Update.addToSet 将项目添加到集合(不可复制) Update.push 将项目附加到数组(可复制)
import org.springframework.data.mongodb.core.*;

@Autowired
MongoTemplate mongoTemplate;
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(idToUpdate));
Update update = new Update();
update.addToSet("targetField", "newValue");
mongoTemplate.updateFirst(query, update, "collectionName");
获取结果文档,使用FindAndModifyOptions
FindAndModifyOptions options = FindAndModifyOptions.options()
        .returnNew(true);
TargetClass result = mongoTemplate.findAndModify(query, update, options, TargetClass.class, "collectionName");
添加多个值
update.addToSet("targetField")
    .each("value1", "value2");
update.push("targetField")
    .each("value1", "value2");
删除position 处的项目
update.pop("targetField", position);
删除value的项目
update.pull("targetField", "value");
删除多个项目
update.pullAll("targetField", new Object[]"value1", "value2");

【讨论】:

【参考方案2】:

$addToSet

db.collection.update(
  _id: "1"
,

  "$addToSet": 
    targetField: 
      $each: [
        "Steve",
        "Sam"
      ]
    
  
,

  new: true
)

mongoplayground

【讨论】:

以上是关于如何使用 MongoDB 和 Spring 的存储库更新列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置两个实例mongodb使用spring boot和spring data

如何使用Spring框架加密文档中的所有MongoDB字段

如何使用 Spring Boot 在 Mongodb 中保存重复项?

如何使用 @Query 在日期 Spring 数据 MongoDB 之间进行选择

如何在spring data mongoDB中指定数据库名称

使用spring在mongodb中存储JSON模式