我有一个像
这样的记录列表[
{"id":"1", "name":"a", "user":"u1"},
{"id":"2", "name":"b", "user":"u1"},
{"id":"3", "name":"c", "user":"u1"}
]
现在,根据数据库中是否存在条目,它应该更新或插入文档。同样,对于更新,存在以下条件:现有user
字段的值应与文档中user
的提供值相匹配。
当然我可以在循环中运行列表并使用
mongoOperations.save(...);
但如果我有一个巨大的列表,那么我将不得不为每个条目执行一次db操作,我认为这些操作不是很有效。有没有其他有效的方法来执行此操作?
答案 0 :(得分:2)
如果您正在使用CRUD存储库,则CRUD存储库提供可用于单个实体的save()方法(mongoCollection),或者您可以使用重载的保存方法
<S extends T> List<S> saveAll(Iterable<S> entites)
可以使用Arraylist并保存arraylist对象。无需使用循环。
您可以看到以下示例,其中InventoryService类创建3个Inventory对象并将所有内容添加到ArrayList中,最后将其传递给作为CRUD存储库的库存存储库。
@Service
public class InventoryService {
private static final Logger LOGGER = LoggerFactory.getLogger(InventoryService.class);
@Autowired
private InventoryRepository inventoryRepository;
public void aveInventoryDetails() {
List<Inventory> inventoryList = new ArrayList<Inventory>();
inventoryList.add(new Inventory("500", 10));
inventoryList.add(new Inventory("600", 20));
inventoryList.add(new Inventory("700", 30));
try {
inventoryRepository.saveAll(inventoryList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
示例Mongo存储库
package com.bjs.repository;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.mongodb.repository.MongoRepository;
import com.bjs.model.Inventory;
public interface InventoryRepository extends MongoRepository<Inventory, String> {
// empty as not defining any new method , we can use the existing save method
}
答案 1 :(得分:1)
您可以使用mongoTemplate.updateMulti()如下更新记录列表
Query query = new Query();
query.addCriteria(Criteria.where("filteringField").is("filteringFieldValue));
Update update = new Update();
update.set("fieldToBeUpdated", "fieldToBeUpdatedValue");
mongoTemplate.updateMulti(query, update, YourClass.class);