MongoDBでTwitterのuser_timelineのcreated_atをISODateに変換

Twitterのuser_timelineのcreated_atをMongoDBで利用する際に便利なように変換します。
Twitterのcreated_atの形式は"Wed Nov 07 00:03:57 +0000 2018"の形式です。
ですが、```{"created_at":{$gt:"Wed Nov 06 00:00:00 +0000 2018"}}```のようなクエリーは使えません。

そこで（created_atを置き換えるのではなく）created_at_isodateという要素を追加するようにします。

[stackoverflow](https://stackoverflow.com/questions/34837489/how-can-convert-string-to-date-with-mongo-aggregation
)にほぼ同じようなのがあったので参考~~（ほぼパクリ）~~にさせていただきました。

```js
var bulk = db.timeline.initializeUnorderedBulkOp();
db.timeline.find({"created_at": {"$exists": true}}).forEach(function (doc) {
    var newDate = new Date(doc.created_at);
    bulk.find({ "_id": doc._id }).updateOne({
        "$set": { "created_at_isodate": newDate}
    });
})
bulk.execute();
```

20件分の実行結果はこんな感じです。

```sh
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 0,
	"nUpserted" : 0,
	"nMatched" : 20,
	"nModified" : 20,
	"nRemoved" : 0,
	"upserted" : [ ]
})
```

これを実行すると下記のように**created_at_isodate**ができました。

```sh
> db.timeline.find({},{"created_at":1,"created_at_isodate":1})
{ "_id" : ObjectId("5be24be15790a3000640fca0"), "created_at" : "Wed Nov 07 00:03:57 +0000 2018", "created_at_isodate" : ISODate("2018-11-07T00:03:57Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca1"), "created_at" : "Wed Nov 07 00:02:31 +0000 2018", "created_at_isodate" : ISODate("2018-11-07T00:02:31Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca2"), "created_at" : "Tue Nov 06 23:52:47 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T23:52:47Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca3"), "created_at" : "Tue Nov 06 23:50:28 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T23:50:28Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca4"), "created_at" : "Tue Nov 06 23:46:20 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T23:46:20Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca5"), "created_at" : "Tue Nov 06 23:41:35 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T23:41:35Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca6"), "created_at" : "Tue Nov 06 23:25:11 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T23:25:11Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca7"), "created_at" : "Tue Nov 06 23:23:26 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T23:23:26Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca8"), "created_at" : "Tue Nov 06 22:29:39 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T22:29:39Z") }
{ "_id" : ObjectId("5be24be15790a3000640fca9"), "created_at" : "Tue Nov 06 21:01:41 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T21:01:41Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcaa"), "created_at" : "Tue Nov 06 14:30:15 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T14:30:15Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcab"), "created_at" : "Tue Nov 06 14:03:49 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T14:03:49Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcac"), "created_at" : "Tue Nov 06 14:03:32 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T14:03:32Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcad"), "created_at" : "Tue Nov 06 14:01:58 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T14:01:58Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcae"), "created_at" : "Tue Nov 06 12:49:20 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T12:49:20Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcaf"), "created_at" : "Tue Nov 06 12:09:54 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T12:09:54Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcb0"), "created_at" : "Tue Nov 06 12:04:40 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T12:04:40Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcb1"), "created_at" : "Tue Nov 06 12:02:54 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T12:02:54Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcb2"), "created_at" : "Tue Nov 06 12:01:03 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T12:01:03Z") }
{ "_id" : ObjectId("5be24be15790a3000640fcb3"), "created_at" : "Tue Nov 06 12:00:13 +0000 2018", "created_at_isodate" : ISODate("2018-11-06T12:00:13Z") }
```

これで期間指定もできそうです。

＃ちなみにISODateって今後もタイムゾーンには対応しないのかな...？Aggregation機能を使えばいいというのがあるのかもしれないけど...

```js
db.timeline.aggregate([{$project:{"created_at":1,"created_at_isodate":{
    $dateToString: {
        format: "%Y-%m-%d %H:%M:%S %z",
        timezone: "Asia/Tokyo",
        date: "$created_at_isodate"
        }
    }}}]).forEach(
        function(d) {
            print(d.created_at_isodate);
        }
    )
```
```sh
2018-11-07 09:03:57 +0900
2018-11-07 09:02:31 +0900
2018-11-07 08:52:47 +0900
2018-11-07 08:50:28 +0900
2018-11-07 08:46:20 +0900
2018-11-07 08:41:35 +0900
2018-11-07 08:25:11 +0900
2018-11-07 08:23:26 +0900
2018-11-07 07:29:39 +0900
2018-11-07 06:01:41 +0900
2018-11-06 23:30:15 +0900
2018-11-06 23:03:49 +0900
2018-11-06 23:03:32 +0900
2018-11-06 23:01:58 +0900
2018-11-06 21:49:20 +0900
2018-11-06 21:09:54 +0900
2018-11-06 21:04:40 +0900
2018-11-06 21:02:54 +0900
2018-11-06 21:01:03 +0900
2018-11-06 21:00:13 +0900
```