[英]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"
}
}
}
]
}
}
}
}
}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.