如何使用Ruby MongoDB驱动程序将文档字段值作为ISODate插入?

时间:2016-05-07 04:32:15

标签: ruby-on-rails ruby mongodb

这可能非常简单,但目前在Ruby领域显而易见的是难以捉摸。

如何将文档字段值作为ISODate插入而不是使用Ruby MongoDB驱动程序插入字符串?当我在MongoDB shell中查询一个集合时,我希望时间戳是一个ISODate对象:

{
  "_id": ObjectId("570348904b3833000addcd67"),
  "timestamp": ISODate("2016-04-04T21:23:52.058Z")
}

{
  "_id": ObjectId("570348904b3833000addcd67"),
  "timestamp": "2016-04-04T21:23:52.058Z" // or ms since epoch
}

请不要建议我使用ms | s,因为epoch。这不是解决方案。

我试过......

logs = []
t = Time.at(1448064510963.fdiv(1000))
mongo_hash['timestamp'] = t # --> String
mongo_hash[:timestamp] = t # --> String
mongo_hash['timestamp'] = t.to_datetime # --> Weird Date String
mongo_hash['timestamp'] = t.to_date # --> String without time
logs << mongo_hash

我正在将mongo_hash推送到传递给insert_many的数组中。

mongo_client[:logs].insert_many(logs)

...我在MongoDB 3.0.x中获得的是使用Ruby Mongo驱动程序v2.2.4的时间戳的字符串......

{
  "_id": ObjectId("573107ac4f5bd9ac14920bb0"),
  "timestamp": "2015-11-20T11:59:43.127-08:00"
}

JS / Python中的一块蛋糕......为什么这么奇怪,Ruby? Whyyyy?

1 个答案:

答案 0 :(得分:3)

我找不到任何关于此的文档,但如果你查看official examples,你会看到:

result = client[:restaurants].insert_one({
  #...
  grades: [
    {
      date: DateTime.strptime('2014-10-01', '%Y-%m-%d'),
      grade: 'A',
      score: 11
    },
    #...
  ]
  #...
})

这表明您可以使用简单的DateTime实例将时间插入MongoDB。那么如果我们尝试那会怎么样?良好:

irb>  mongo[:pancakes].insert_one(:kind => 'blueberry', :created_at => DateTime.now)

然后在MongoDB中:

> db.pancakes.find()
{ "_id" : ..., "kind" : "blueberry", "created_at" : ISODate("2016-05-15T17:44:12.096Z") }

我们想要的ISODate就在那里。

然后,如果我们假装我们在Rails中:

irb> require 'active_support/all' # To get to_datetime
irb> mongo[:pancakes].insert_one(:kind => 'banana', :created_at => '2016-05-15T06:11:42.235Z'.to_datetime)

我们在MongoDB中得到了这个:

> db.pancakes.find()
{ "_id" : ObjectId("5738b56cf638ccf407c71ef5"), "kind" : "blueberry", "created_at" : ISODate("2016-05-15T17:44:12.096Z") }
{ "_id" : ObjectId("5738b74ef638ccf4da4c2675"), "kind" : "banana", "created_at" : ISODate("2016-05-15T06:11:42.235Z") }
再次

ISODate

我在这里使用官方Ruby驱动程序2.2.5版。