Datastore ds = datastore;
Query<Document> query = ds.createQuery(Document.class).field("_id").equal(documentId);
UpdateOperations<Document> ops = ds.createUpdateOperations(Document.class).set("draft.languages", draft);
ds.update(query, ops);
这是我要改变的课程
@Embedded("language")
private String language;
private String body;
之前的json:
"languages" : [
{
"language" : "en",
"body" : "bla blaaaaaaaaaaaa ttttttt"
},
{
"language" : "ru",
"body" : "faksdfsdghfhshsssssssssh"
}
]
json之后:
"languages" : [
{
"language" : "en",
"body" : "bla blaaaaaaaaaaaa ttttttt"
},
{
"language" : "ru",
"body" : "faksdfsdghfhshsssssssssh"
},
{
"language" : "en",
"body" : "blablablablalblalaakfslkdfjkldf"
}
]
草案是语言清单
我正在尝试进行更新,如果该语言存在于草拟段中,或插入新的,问题是正文不同,因此它总是插入新的而不是替换旧的。
我认为我缺少了一些东西(我使用$ addtoset并且它添加了列表而不是替换)
现在我正在使用set并替换整个列表,还有更好的选择吗?
谢谢你的帮助!
我想做的事的例子
之前的json
插入
"languages" : [
{
"language" : "en",
"body" : "bla blaaaaaaaaaaaa"
},
{
"language" : "it",
"body" : "faksdfsdghfhshsssssssssh"
}
]
我希望结果将是:
"languages" : [
{
"language" : "en",
"body" : "bla blaaaaaaaaaaaa"
},
{
"language" : "ru",
"body" : "faksdfsdghfhshsssssssssh"
},
{
"language" : "it",
"body" : "faksdfsdghfhshsssssssssh"
}
]
最佳答案
您可以为languages.language
创建唯一索引,然后首先尝试更新它,如果没有匹配的文档,则将新文档推送到数组中
long matchedCount = coll.updateOne(
Filters.and(
Filters.eq("_id", new ObjectId("yourid")),
Filters.eq("languages.language", "en")
),
new Document(
"$set",
new Document("languages.$.body", "zuzuzu"))
).getMatchedCount();
if (matchedCount == 0) {
coll.updateOne(
Filters.eq("_id", new ObjectId("yourid")),
new Document(
"$push",
new Document(
"languages",
new Document("language", "en").append("body", "zuzuzu")
)
)
);
}