0

我有这样的文件:

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

我必须将文本值更改为“最酷的文本”。我正在使用带有 Criteria api 的 Spring 的 MongoTemplate 并编写了下面的代码

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) 返回我想要更改的完全相同的文档。

我究竟做错了什么?

4

2 回答 2

1

我认为你应该使用:

查询中的 messages._id 而不是messages .$._id

messages.$.text而不是 Update 方法中的文本

试一试(我已经测试过,它有效)。

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);
于 2015-03-01T22:16:41.850 回答
0

这就是我所做的,获取文档,更新值然后调用更新,它工作正常,这使得代码非常简单且易于调试。

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);
于 2015-03-01T21:34:41.350 回答