我在mongo db中有一个带有以下字段的集合
{
"_id" : ObjectId("57f370653368b91e7b932be3"),
"_class" : "com.cupola.fwmp.vo.MaterialRequestVO",
"ticketId" : NumberLong(12343545),
"materialId" : NumberLong(43243545),
"quantity" : 4,
"usrId" : NumberLong(3535455),
"addedON" : ISODate("2073-02-04T20:09:33.688Z"),
"addedBy" : NumberLong(654661285)
}
如果找不到ticketId和materialId的相同组合,我必须将数据添加到集合中,否则我必须更新。
在R& D之后我才知道mongoTemplate.findAndModify()会有所帮助。
以下是我的代码。
Update update=new Update();
update.set("quantity", materialRequest.getQuantity());
update.set("usrId", materialRequest..getUsrId());
query.addCriteria(Criteria.where("ticketId").is(materialRequest.getTicketId()).and("materialId").is(materialRequest.getMaterialId()));
mongoTemplate.findAndModify(query, update, new FindAndModifyOptions().returnNew(true),MaterialRequest.class, MongoCollections.MATERIAL_CONSUMPTION_COLLECTION);
MaterialRequest.class是实体
MongoCollections.MATERIAL_CONSUMPTION_COLLECTION是集合名称。
我在添加重复数据时收到以下错误消息,
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second 'materialId' criteria. Query already contains '{ "ticketId" : 12343545 , "materialId" : 43243545}'.
但是如果有重复,那么Collection应该更新。
答案 0 :(得分:0)
最好使用Spring提供的Mongorepository。这是问题的症结所在。请查看https://spring.io/guides/gs/accessing-data-mongodb/了解详情。
将此添加到您的上下文中:
<mongo:db-factory dbname="mongoDbName" host="mongoServer" port="mongoPort"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
<mongo:repositories base-package="com.test.dao.mongo"/> <!-- package containing all the mongo repositories corresponding to this connection -->
使用mongo存储库根据您的条件查找JSON对象。用于查找必要数据的方法如下所示。
public MaterialConsumption findByTicketIdAndMaterialId(long ticketId, long materialId);
修改执行更新操作的类中的所需数据。
MaterialConsumption obj = repo.findByTicketIdAndMaterialId(12343545, 43243545)
obj.setTicketId(1231332);
在mongo存储库中使用save()方法。这将执行并插入,即插入(如果不可用)或更新(如果存在)。
repo.save(obj);
答案 1 :(得分:0)
我使用下面的代码来执行添加/更新操作。它正在工作
MongoOperations mongoOperations; //inject
Query query = new Query();
Update update=new Update();
update.set("quantity", materialRequest.getQuantity());
update.set("usrId", materialRequest..getUsrId());
query.addCriteria(Criteria.where("ticketId").is(materialRequest.getTicketId()).and("materialId").is(materialRequest.getMaterialId()));
long count = mongoOperations.count(query, MaterialRequest.class);
if (count <= 0)
{
mongoOperations.save(materialRequestList, MongoCollections.MATERIAL_REQUEST_COLLECTION);
} else
{
mongoOperations.updateFirst(query, update, MaterialRequest.class);
}
MaterialRequest.class是实体类
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second 'materialId' criteria. Query already contains '{ "ticketId" : 12343545 , "materialId" : 43243545}'.
上面的异常即将发生,因为在循环中我在下面的语句中调用
query.addCriteria(Criteria.where("ticketId").is(materialRequest.getTicketId()).and("materialId").is(materialRequest.getMaterialId()));
表示同一个查询对象。
我通过调用Query query = new Query()解决了这个问题。在循环中