簡體   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