我有一个像这样的记录列表
[
{"id":"1", "name":"a", "user":"u1"},
{"id":"2", "name":"b", "user":"u1"},
{"id":"3", "name":"c", "user":"u1"}
]
现在,根据数据库中是否已存在条目,它应该更新或插入文档.此外,对于更新,存在一个条件,即现有用户字段的值应与文档中用户提供的值相匹配.
当然,我可以在循环中运行列表并使用
mongoOperations.save(...);
但是,如果我有一个巨大的列表,那么我将不得不为每个条目执行一个db操作,我认为这不是有效的.有没有其他有效的方法来执行此操作?
最佳答案 如果您正在使用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
}
供参考 – http://docs.spring.io/autorepo/docs/spring-data-commons/1.9.1.RELEASE/api/org/springframework/data/repository/CrudRepository.html#save-java.lang.Iterable-