【问题标题】:MongoDB - trying to replace value in an arrayMongoDB - 尝试替换数组中的值
【发布时间】:2016-12-06 15:11:13
【问题描述】:
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"
                    }
            ]

【问题讨论】:

标签: java mongodb morphia


【解决方案1】:

您可以为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")
      )
    )
  );
}

【讨论】:

  • 如果我尝试插入的列表仅包含 1 个对象,则此方法有效.....我正在尝试将整个列表放入文档中...上面有一个示例
  • 循环遍历您尝试插入的列表
  • 想过这样做,但我在想也许已经有一个命令可以做到这一点,比如 $addToSet 可以处理对象
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2022-08-10
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多