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")
      )
    )
  );
}

10-07 18:54
查看更多