如何替换 MongoDB Collection 中的嵌套字符串值

问题描述 投票:0回答:1

我得到了具有类似结构的集合:

"_id": ObjectId("64c9d5e028bcb318aa86685a"),
...
"ExamOrder" : [],
"ExamPerformed" : [ 
        {
            "authorDatetime" : "2023-08-01T16:15:00.000Z",
            "result" : {
                "value" : 114,
                "unit" : "mmHg"
            }
        },
        {
            "authorDatetime" : "2023-08-01T16:15:00.000Z",
            "result" : {
                "value" : 70,
                "unit" : "in"
            }
        }
    ],
    ...

我想要的是将每个文档中出现的任何单位“mmHg”替换为“mm[Hg]”。

我尝试过这样的事情:

updateMany(
  {"ExamPerformed.result.unit" : "mmHg"},
  [{
    "$set": 
   {"ExamPerformed": 
     {"$map": 
       {"input": "$ExamPerformed",
        "in": 
         {"$mergeObjects": 
           ["$$this",
             {"result": { 
                 "unit":
                 {"$replaceAll": 
                 {"input": "$unit",
                  "find": "in",
                  "replacement": "inches"}}
                 } 
               }]}}}}

但是这个会在每个条目中更改整个“结果”对象:

{
            "authorDatetime" : "2023-08-01T16:15:00.000Z",
            "result" : {
                "unit" : null
            }
        },

预期结果:

"_id": ObjectId("64c9d5e028bcb318aa86685a"),
...
"ExamOrder" : [],
"ExamPerformed" : [ 
        {
            "authorDatetime" : "2023-08-01T16:15:00.000Z",
            "result" : {
                "value" : 114,
                "unit" : "mm[Hg]"
            }
        },
        {
            "authorDatetime" : "2023-08-01T16:15:00.000Z",
            "result" : {
                "value" : 70,
                "unit" : "in"
            }
        }
    ],
    ...

有人可以帮助我建立适当的聚合管道吗?

mongodb mongodb-query aggregation-framework
1个回答
0
投票

你们其实很亲近。使用

$map
$mergeObject
的正确语法如下:

db.collection.update({
  "ExamPerformed.result.unit": {
    "$regex": "mmHg"
  }
},
[
  {
    "$set": {
      "ExamPerformed": {
        "$map": {
          "input": "$ExamPerformed",
          "as": "ep",
          "in": {
            "$mergeObjects": [
              "$$ep",
              {
                "result": {
                  "value": "$$ep.result.value",
                  "unit": {
                    "$replaceAll": {
                      "input": "$$ep.result.unit",
                      "find": "mmHg",
                      "replacement": "mm[Hg]"
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.