如何使用mongotemplate(Spring)

时间:2016-10-04 11:24:35

标签: java spring mongodb

我在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应该更新。

2 个答案:

答案 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()解决了这个问题。在循环中