在 mongodb 数组元素中设置值
Set value in mongodb array element
我有这样一个文档:
{
"_id" : "1",
"messages" : [
{
"_id" : "second",
"conversationId" : "1",
"timestamp" : ISODate("2015-03-01T20:16:30.991Z"),
"text" : "cool text",
"operatorId" : "operatorId",
"clientId" : "clientId",
"fromClient" : true
}
]
}
我必须将文本值更改为 "coolest text"。我正在使用 Spring 的 MongoTemplate 和 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) returns 与我要更改的文档完全相同。
我做错了什么?
这就是我所做的,获取文档,更新值然后调用更新,它工作正常,这使得代码非常简单且易于调试。
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);
我想你应该用过:
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);
我有这样一个文档:
{
"_id" : "1",
"messages" : [
{
"_id" : "second",
"conversationId" : "1",
"timestamp" : ISODate("2015-03-01T20:16:30.991Z"),
"text" : "cool text",
"operatorId" : "operatorId",
"clientId" : "clientId",
"fromClient" : true
}
]
}
我必须将文本值更改为 "coolest text"。我正在使用 Spring 的 MongoTemplate 和 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) returns 与我要更改的文档完全相同。
我做错了什么?
这就是我所做的,获取文档,更新值然后调用更新,它工作正常,这使得代码非常简单且易于调试。
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);
我想你应该用过:
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);