Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用spring在mongodb中进行智能更新?_Mongodb_Spring Data Jpa_Spring Data Mongodb - Fatal编程技术网

如何使用spring在mongodb中进行智能更新?

如何使用spring在mongodb中进行智能更新?,mongodb,spring-data-jpa,spring-data-mongodb,Mongodb,Spring Data Jpa,Spring Data Mongodb,mongo db中是否有一种智能优化的数据更新方法?我现在用下面的方式做,但我想用更少的数据库调用来做 @Transactional public void modifyParticipant(String id, String roomId, updates) { Conference conference = conferenceRepository.findParticipantsByRoomId(roomId); for(Participant participant :

mongo db中是否有一种智能优化的数据更新方法?我现在用下面的方式做,但我想用更少的数据库调用来做

@Transactional
public void modifyParticipant(String id, String roomId, updates) {
    Conference conference = conferenceRepository.findParticipantsByRoomId(roomId);
    for(Participant participant : conference.getParticipants()){
        if(participant.getId().equals(id)){
            //modify the participant
            break;
        }
    }
    conference.updateTime();
    conferenceRepository.save(conference);
    }
我尝试了下面的方法,但始终没有成功,因为查询总是获取参与者数组,即使我尝试只获取一个与id匹配的参与者。并且由于数组的原因,更新失败

企图
理想情况下,您希望获得与以下更新操作等效的mongo shell,该操作使用运算符和运算符来标识要更新的数组中的元素,而无需明确指定元素在数组中的位置。这意味着在update语句的查询端匹配数组元素的任何条件将只匹配找到的第一个数组索引:

db.conference.update(
    {
        "_id": "f9091ed9-c828-4b52-b1c3-44e42f719694",
        "participants._id": "6b49b373-1e61-4c98-a703-c1c2bc4da0e2"
    },
    {
        "$set": {
            "participants.$.firstName": "foo",
            "participants.$.lastName": "bar"
        }
    }
)
Spring Data MongoDB等效示例如下所示:

Query query = new Query(new Criteria().andOperator(
    Criteria.where("_id").is("f9091ed9-c828-4b52-b1c3-44e42f719694"),
    Criteria.where("participants._id").is("6b49b373-1e61-4c98-a703-c1c2bc4da0e2"));

Update update = new Update();
update.set("participants.$.firstName", "foo");
update.set("participants.$.lastName", "bar");
mongoTemplate.updateFirst(query, update, Conference.class);

如果只找到了两个参与者,但更新正在运行db.getCollection('session').find({“$and”:[{{u id:“f9091ed9-c828-4b52-b1c3-44e42f719694”},{“参与者”.\u id:“6b49b373-1e61-4c98-a703-c1c2bc4da0e2”})。是否有其他方法可以直接获取参与者而不是所有参与者?您可以使用仅返回投影中的参与者数组。
db.conference.update(
    {
        "_id": "f9091ed9-c828-4b52-b1c3-44e42f719694",
        "participants._id": "6b49b373-1e61-4c98-a703-c1c2bc4da0e2"
    },
    {
        "$set": {
            "participants.$.firstName": "foo",
            "participants.$.lastName": "bar"
        }
    }
)
Query query = new Query(new Criteria().andOperator(
    Criteria.where("_id").is("f9091ed9-c828-4b52-b1c3-44e42f719694"),
    Criteria.where("participants._id").is("6b49b373-1e61-4c98-a703-c1c2bc4da0e2"));

Update update = new Update();
update.set("participants.$.firstName", "foo");
update.set("participants.$.lastName", "bar");
mongoTemplate.updateFirst(query, update, Conference.class);