繁体   English   中英

使用 $Concat 和 UpdateOne 更新子对象字符串字段 Java

[英]Use $Concat with UpdateOne to update the subobject string field Java

我正在使用 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
}

我想更新 empCode = "EMP2" 的姓氏。

以下是我执行操作的代码片段

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 方法帮助更新此类字段。 谢谢

有点复杂的 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"
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

示例 Mongo Playground

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM