簡體   English   中英

使用 $set 和聚合更新 MongoDB 集合

[英]MongoDB collection update with $set and aggregate

我需要將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'}

看起來您有幾個問題,首先是您沒有使用 4.2 的最新驅動程序(它仍處於測試階段,因此如果您只是進行 pip 升級,您仍將使用 3.8,而您需要 3.9)。 至少在 GA 之前使用python -m pip install https://github.com/mongodb/mongo-python-driver/archive/3.9.0b1.tar.gz安裝最新版本。

其次,您應該使用update_oneupdate_many而不是使用multi標志update

使用最新版本嘗試您的代碼,這有效:

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

我已經嘗試過你的聚合框架問題,

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")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM