【问题标题】:Use $Concat with UpdateOne to update the subobject string field Java使用 $Concat 和 UpdateOne 更新子对象字符串字段 Java
【发布时间】:2021-11-24 08:53:26
【问题描述】:

我正在使用 mongo-java-driver 进行 mongodb 连接,并想更新记录的子对象中的一个字段。

记录:

{
    "_id": "61866c32d11c9aefb01125f7",
    "number": 1900,
    "oms": "ters",
    "data": [
        {
            "empCode": "EMP2",
            "firstname": "vivek",
            "lastname": "bdh",
            "age": 30
        },
        {
            "empCode": "EMP3",
            "firstname": "ravi",
            "lastname": "sh",
            "age": 30
        }
    ],
    "volgnummer": 1
}

我想更新 lastname where empCode = "EMP2"。

以下是我的代码sn-p来执行操作

public class FixDataApp {
    public static void main(String[] args) throws IOException {
        MongoCollection collection = MongoConfig.getCollection(args[0], args[1], "myCollection");
        

        BasicDBObject concat = new BasicDBObject();
        concat.put("$concat",  Arrays.asList(
                new BsonString("data.$.lastname"),
                new BsonString(" TestAppendStr")));

        BasicDBObject updateFields = new BasicDBObject();
        updateFields.append( "data.$.lastname", concat);

        BasicDBObject command = new BasicDBObject();
        command.put("$set", updateFields);

        UpdateResult result = collection.updateOne(
                Filters.and(
                        Filters.eq("_id", "61866c32d11c9aefb01125f7"),
                        Filters.eq("data.empCode", "EMP2")
                ),
                command
        );
        System.out.println("Record updated successfully " + result.getModifiedCount());
    }
}

当我执行上述应用程序时出现以下错误...

Exception in thread "main" com.mongodb.MongoWriteException: The dollar ($) prefixed field '$concat' in 'data.0.lastname.$concat' is not valid for storage.
    at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1060)
    at com.mongodb.client.internal.MongoCollectionImpl.executeUpdate(MongoCollectionImpl.java:1037)
    at com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:622)
    at com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:617)
    at common.FixDataApp.main(FixDataApp.java:30)

任何人都可以帮助使用 $concat 和 update 方法更新此类字段。 谢谢

【问题讨论】:

    标签: java mongodb mongodb-query


    【解决方案1】:

    有点复杂的 MongoDB 更新查询。

    当您在数组字段中更新文档的同时,您正在使用$concat,这需要一个聚合管道。

    如果没有$concat(聚合管道),您可以使用arrayFilters$[elem],它们可以直接且更容易地更新嵌套数组中所需的文档字段。


    以下查询的要点:

    $map - 迭代和更新data 数组字段中的每个文档。

    $cond - 当满足要求时,lastname 字段将使用来自$concat 的值进行更新。否则它将使用原始值进行更新。

    $mergeObjects - 将原始文档 $emp 与新的更新字段 lastname 合并。

    db.collection.update({
      "_id": "61866c32d11c9aefb01125f7",
      "data.empCode": "EMP2"
    },
    [
      {
        $set: {
          "data": {
            "$map": {
              "input": "$data",
              "as": "emp",
              "in": {
                $mergeObjects: [
                  "$$emp",
                  {
                    "lastname": {
                      $cond: {
                        if: {
                          $eq: [
                            "$$emp.empCode",
                            "EMP2"
                          ]
                        },
                        then: {
                          $concat: [
                            "$$emp.lastname",
                            " TestAppendStr"
                          ]
                        },
                        else: "$$emp.lastname"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    Sample Mongo Playground

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2014-04-18
      • 2022-11-10
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2013-09-11
      相关资源
      最近更新 更多