【问题标题】:How to convert a sting field to an ObjectId inside of an array of of objects via MongoDb Shell?如何通过 MongoDb Shell 将 sting 字段转换为对象数组内的 ObjectId?
【发布时间】:2020-12-14 01:10:35
【问题描述】:

所以我的 MongoDb 文档看起来像这样:

{
    "_id" : ObjectId("5f1842d238ec58056d94bbb3"),
    "itemsPurchased" : [ 
        {
            "_id" : "5e7365360665d10011756af2",
            "created" : "2020-03-19T12:27:34.108Z",
            "productLine" : "5ce8ec9df5cc72002fee0d4e",
            "price" : 1.9,
            "tax" : 7,
            "ean" : "42272120",
            "expirationDate" : "2020-06-17T12:27:34.103Z",
            "kiosk" : "5c17a3d963ca649138ec522c",
            "loadCell" : "1"
        }, 
        {
            "_id" : "5e7365360665d10011756af3",
            "created" : "2020-03-19T12:27:34.108Z",
            "productLine" : "5ce8ec9df5cc72002fee0d4e",
            "price" : 1.9,
            "tax" : 7,
            "ean" : "42272120",
            "expirationDate" : "2020-06-17T12:27:34.103Z",
            "kiosk" : "5c17a3d963ca649138ec522c",
            "loadCell" : "1"
        }
    ],
    "paymentMethod" : [],
    "type" : "purchase",
    "total" : NumberDecimal("3.8"),
    "session" : ObjectId("5f1842bf1f2028e369d945f0"),
    "orgId" : ObjectId("5cddce9a51cbb2002d636741"),
    "created" : ISODate("2020-07-22T13:44:50.973Z"),
    "updated" : ISODate("2020-07-22T13:44:50.973Z"),
    "__v" : 0
}

问题在于 itemsPurchased[] 内部(由于逻辑错误)有字符串类型的 id。例如"_id" : "5e7365360665d10011756af2""productLine" : "5ce8ec9df5cc72002fee0d4e"。如何浏览所有在 itemsPurchased[] 中具有字符串而不是 ObjectIds 的对象的文档,并将它们转换为 ObjectId 类型。我尝试将 $convert 和 $toObjectId 与 $map 一起使用,但似乎无法正确使用。

db.transactions.aggregate([
  { "$match": { "itemsPurchased._id": {$type: "string"}}},
  { "$set": "itemsPurchased1": {
      "$map": {
        "input": "$itemsPurchased",
        "in": {
          "$toObjectId": [
            "$$this",
            {
              "productLine": {
                "$toObjectId": "$$this.productLine"
              }
            }
          ]
        }
      }
    }
  }

无法正确获取地图部分

【问题讨论】:

    标签: mongodb mongodb-shell


    【解决方案1】:
    db.getCollection('transactions').update(
    {"itemsPurchased.kiosk":{$type: "string"}}, 
    [{
        "$set": {
          "itemsPurchased": {
            "$map": {
              "input": "$itemsPurchased",
              "in": {
                "$mergeObjects": [
                  "$$this",
                  {
                    "kiosk": {
                      "$toObjectId": "$$this.kiosk"
                    }
                  }
                ]
              }
            }
          }
        }
      }], 
    {multi:true})
    

    这是如何更新...

    【讨论】:

      【解决方案2】:

      你已经正确使用$toObjectId,你只需要更改$mergeObjects而不是$toObjectId,当你在$$this里面合并$map时,

        {
          "$set": {
            "itemsPurchased1": {
              "$map": {
                "input": "$itemsPurchased",
                "in": {
                  "$mergeObjects": ["$$this", { "productLine": { "$toObjectId": "$$this.productLine" } }]
                }
              }
            }
          }
        }
      

      Playground


      updateMany

      db.transactions.updateMany({}, 
      [
        {
          "$set": {
            "itemsPurchased": {
              "$map": {
                "input": "$itemsPurchased",
                "in": {
                  "$mergeObjects": ["$$this", { "productLine": { "$toObjectId": "$$this.productLine" } }]
                }
              }
            }
          }
        }
      ])
      

      【讨论】:

      • updateMany op怎么做,聚合管道不保存结果
      • 您在问题中没有提到要更新,您能否在我更正后提供您如何使用 updateMany 进行更新。
      • 实际上,我想做的只是更新那些字符串 id,但设法错误地提出了问题......所以聚合工作完美,就像你向我展示的那样,但我不知道聚合结果不会被写回数据库...试图玩弄并采用查询来updateMany,到目前为止没有结果...
      • 你得到了什么确切的响应以及你在哪里执行这个查询?我已经测试过它的工作正常,
      猜你喜欢
      • 2019-09-08
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多