【问题标题】:MongoDB collection update with $set and aggregate使用 $set 和聚合更新 MongoDB 集合
【发布时间】:2019-07-26 00:51:15
【问题描述】:

我需要将timestamp_ms 的类型从string 更改为double 并创建基于这个新timestamp_ms 字段的FixedDate 字段。然后,将时间戳信息更改为NewDate 字段中的 ISO 日期。

我使用了这个代码:

collection.update({
    "FixedDate": {"$exists": False}
},[{
    "$set":
        {"FixedDate":
            {"$convert":
                {"input": "$timestamp_ms",
                "to": "double"
                }
            }
        }
    },
    {"$set":
        {"NewDate":
                {"$toDate": "$FixedDate"
                }
            }
    }
], multi=True)

它给出了这个错误信息:

TypeError: document must be an instance of dict, bson.son.SON, or other type that inherits from collections.Mapping

我的数据如下所示:

{'_id': ObjectId('5afea920d326051990a7f337'), 'created_at': 'Fri May 18 10:21:07 +0000 2018', 'timestamp_ms': '1526638867739'}
{'_id': ObjectId('5afea920d326051990a7f339'), 'created_at': 'Fri May 18 10:21:08 +0000 2018', 'timestamp_ms': '1526638868310'}
{'_id': ObjectId('5afea972d326051c5c05bc11'), 'created_at': 'Fri May 18 10:22:30 +0000 2018', 'timestamp_ms': '1526638950799'}
{'_id': ObjectId('5afea974d326051c5c05bc16'), 'created_at': 'Fri May 18 10:22:32 +0000 2018', 'timestamp_ms': '1526638952160'}
{'_id': ObjectId('5afea974d326051c5c05bc17'), 'created_at': 'Fri May 18 10:22:32 +0000 2018', 'timestamp_ms': '1526638952841'}

【问题讨论】:

    标签: python mongodb aggregate pymongo updates


    【解决方案1】:

    看起来您有几个问题,首先是您没有使用 4.2 的最新驱动程序(它仍处于测试阶段,因此如果您刚刚进行 pip 升级,您仍将使用 3.8 并且您需要 3.9)。安装最新的 python -m pip install https://github.com/mongodb/mongo-python-driver/archive/3.9.0b1.tar.gz 至少在 GA 之前。

    其次,您应该使用update_one 或update_many 而不是update 和multi 标志。

    用最新版本尝试你的代码,这行得通:

    collection.update_many(
       {"FixedDate": {"$exists": False}},
       [{"$set":{
          "FixedDate":{"$toDouble":"$timestamp_ms"}
      }},
      {"$set":{
          "NewDate": {"$toDate": "$FixedDate"}
      }}
    ])
    

    【讨论】:

      【解决方案2】:

      我已经尝试过聚合框架的问题,

      let query = [
          {
              $match: {
                  "FixedDate": { "$exists": false }
              }
          }, {
              $addFields: {
                  "FixedDate":
                      {
                          "$convert":
                              {
                                  "input": "$timestamp_ms",
                                  "to": "double"
                              }
                      },
      
              },
          }, {
              $addFields: {
                  "NewDate":
                      {
                          "$toDate": "$FixedDate"
                      }
              }
          }]
      

      db.collection.aggregate(query)

      这里需要使用两次$addFields

      结果

      /* 1 createdAt:18/05/2018, 15:51:20*/
      {
          "_id" : ObjectId("5afea920d326051990a7f337"),
          "created_at" : "Fri May 18 10:21:07 +0000 2018",
          "timestamp_ms" : "1526638867739",
          "FixedDate" : 1526638867739,
          "NewDate" : ISODate("2018-05-18T15:51:07.739+05:30")
      },
      
      /* 2 createdAt:18/05/2018, 15:51:20*/
      {
          "_id" : ObjectId("5afea920d326051990a7f339"),
          "created_at" : "Fri May 18 10:21:08 +0000 2018",
          "timestamp_ms" : "1526638868310",
          "FixedDate" : 1526638868310,
          "NewDate" : ISODate("2018-05-18T15:51:08.310+05:30")
      },
      
      /* 3 createdAt:18/05/2018, 15:52:42*/
      {
          "_id" : ObjectId("5afea972d326051c5c05bc11"),
          "created_at" : "Fri May 18 10:22:30 +0000 2018",
          "timestamp_ms" : "1526638950799",
          "FixedDate" : 1526638950799,
          "NewDate" : ISODate("2018-05-18T15:52:30.799+05:30")
      },
      
      /* 4 createdAt:18/05/2018, 15:52:44*/
      {
          "_id" : ObjectId("5afea974d326051c5c05bc16"),
          "created_at" : "Fri May 18 10:22:32 +0000 2018",
          "timestamp_ms" : "1526638952160",
          "FixedDate" : 1526638952160,
          "NewDate" : ISODate("2018-05-18T15:52:32.160+05:30")
      },
      
      /* 5 createdAt:18/05/2018, 15:52:44*/
      {
          "_id" : ObjectId("5afea974d326051c5c05bc17"),
          "created_at" : "Fri May 18 10:22:32 +0000 2018",
          "timestamp_ms" : "1526638952841",
          "FixedDate" : 1526638952841,
          "NewDate" : ISODate("2018-05-18T15:52:32.841+05:30")
      }
      

      【讨论】:

      • $set 是 $addFields 的别名,所以你的答案不正确。
      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2014-05-27
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多