Установить значение в элементе массива mongodb

У меня есть такой документ:

{
    "_id" : "1",
    "messages" : [ 
        {
            "_id" : "second",
            "conversationId" : "1",
            "timestamp" : ISODate("2015-03-01T20:16:30.991Z"),
            "text" : "cool text",
            "operatorId" : "operatorId",
            "clientId" : "clientId",
            "fromClient" : true
        }
    ]
}

и я должен изменить текстовое значение на «самый крутой текст». Я использую MongoTemplate Spring с Criteria API и написал код ниже

mongoOps.upsert(
                query(where("_id").is(message.getConversationId()))
                        .addCriteria(where("messages.$._id").is(message.getId())),
                new Update().set("text", message.getText()), ConversationDocument.class);

но ничего не изменилось.

mongoOps.findOne(query(where("_id").is(message.getConversationId())), ConversationDocument) возвращает точно такой же документ, который я хочу изменить.

Что я делаю не так?


person Timur Yarosh    schedule 01.03.2015    source источник


Ответы (2)


Я думаю, вы должны были использовать:

messages._id в запросе вместо messages.$._id

а также

messages.$.text вместо text в вашем методе обновления.

Попробуйте (проверено, работает).

Query query = query(
                new Criteria().andOperator(
                        where("_id").is(conversation.getId()),
                        where("messages._id").is(message.getId())
                )
        );

mongoOps.upsert(query, new Update().set("messages.$.text", "coolest text"), Conversation.class);
person Onur Aktaş    schedule 01.03.2015

Это то, что я делаю, получаю документ, обновляю значения, затем вызываю обновление, все работает нормально, что делает код очень простым и легким для отладки.

ConversationDocument doc =  mongoOps.findOne(query(where("_id").is(message.getConversationId())), ConversationDocument); 

//* you must have methods inside of your ConverstionDocument to set the values in the messages object
Message message doc.getMessage();
message.setText("cool text");

mongoOps.update(doc);
person faljbour    schedule 01.03.2015
comment
Это круто, но полный документ может иметь большой размер, поэтому я хочу использовать запрос на обновление. - person Timur Yarosh; 02.03.2015