这可能非常简单,但目前在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?
答案 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版。