这篇文章主要围绕如何在MongoDb中使用杰克逊将日期字段存储为ISODate和展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在MongoDb中使用杰克逊将日期字段存储为ISODate的优缺
这篇文章主要围绕如何在MongoDb中使用杰克逊将日期字段存储为ISODate和展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在MongoDb中使用杰克逊将日期字段存储为ISODate的优缺点,解答的相关问题,同时也会为您带来golang解析mongodb中的ISODate类型、MongoDB + Nodejs:如何查询ISODate字段?、node.js – 使用mongoose在mongodb中存储文件、node.js – 在MongoDB中存储日期和时区的实用方法。
本文目录一览:- 如何在MongoDb中使用杰克逊将日期字段存储为ISODate()(mongodb日期类型)
- golang解析mongodb中的ISODate类型
- MongoDB + Nodejs:如何查询ISODate字段?
- node.js – 使用mongoose在mongodb中存储文件
- node.js – 在MongoDB中存储日期和时区
如何在MongoDb中使用杰克逊将日期字段存储为ISODate()(mongodb日期类型)
我试图 java.util.Date
使用fasterxml
jackson在mongo集合中保留具有字段的java对象。问题是objectMapper的默认性质是将Date存储为NumberLong类型。
例如,类型 createdTime
字段 java.util.Date
将如下存储:
"createdTime" : NumberLong("1427728445176")
我想以mongo Shell中可用的 ISODate 格式存储它。
现在,我知道有一种格式化对象映射器的方法来将Date存储为String dateformat。但是我只在寻找ISODate()格式。
例如 "createdTime" : ISODate("2015-01-20T16:39:42.132Z")
有没有办法做到这一点 ?请告知大师。在此先感谢您的帮助。
答案1
小编典典您需要的是Jackson Joda模块。如果将其导入到类路径中,则可以在映射器上执行以下操作以将其写为所需的时间戳记:
ObjectMapper mapper = new ObjectMapper();mapper.registerModule(new JodaModule());mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);mapper.writeValueAsString(date);
您可以date
根据需要在上面的代码示例中用POJO 替换。
编辑:看起来您真正想要的是自定义序列化程序。看起来像这样:
public class IsoDateSerializer extends JsonSerializer<DateTime> { @Override public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) { String isoDate = ISODateTimeFormat.dateTime().print(value); jgen.writeRaw("ISODATE(\"" + isoDate + "\")"); }
然后,您将在所有日期时间类型的映射器上注册它
mapper.addSerializer(DateTime.class, new IsoDateSerializer());
或使用注释在函数上指定
@JsonSerializer(using = IsoDateSerializer.class)public DateTime createdTime;
golang解析mongodb中的ISODate类型
在golang中可以使用time.Time数据类型来保存mongodb中的ISODate时间。
g
typeModelstruct{ uploadDatetime.Time`bson:"uploadDate"` } m:=Model{} iferr:=c.Find(nil).Select({"_id":0,"uploadDate":1}).One(&m);err!=nil{ fmt.Printf("Failedtofinddate,error%s\n",err) os.Exit(1) } fmt.Printf("%+v\n",m)
从输出中可以看到golang输出的时间格式是CST时区,golang在处理的过程中将ISO时间转换成了CST时间,从时间面板上来看也比mongodb中的快上8个小时,这个是正常的。
那么golang做插入操作或者时间比较操作的时候需要自己转换时间戳吗?答案是不需要的,来看下插入的例子。
重新插入一条记录,记录的Time字段为当前时间,在golang中可以通过time.Now获取当前时间,查看输出可以看到是CST的时间格式。
Now:=time.Now() fmt.Printf("%+v\n",Now) //output:2016-05-1214:34:00.998011694+0800CST err=c.Insert(Model{Time:Now}) iferr!=nil{ panic(err) }
可以看到存储到mongodb中时间的自动转换为了ISO时间,时间少了8个小时。小结一下就是golang和mongodb中的时间交互不需要考虑额外的东西,因为驱动都进行了转换。
有时我们会将time.Time的时间以字符串的形式存储,那么要和mongodb交互的时候就需要转换time.Time格式
timeString:="2016-05-1214:34:00.998011694+0800CST" t,err:=time.Parse("2006-01-0215:04:05.999999999-0700MST",timeString) iferr!=nil{ panic(err) } fmt.Printf("%+v\n",t)
代码中比较难理解的就是time.Parse的第一个参数,这个其实是golang当中的定义,详细看下time.Time.String()的源码就会明白了。
MongoDB + Nodejs:如何查询ISODate字段?
我正在使用node-mongodb-native驱动程序(http://mongodb.github.io/node-mongodb-
native/)使用nodejs 。
我有带有日期属性存储为ISODate
类型的文档。
通过nodejs,我正在使用以下查询:
db.collection("log").find({ localHitDate: { ''$gte'': ''2013-12-12T16:00:00.000Z'', ''$lt'': ''2013-12-12T18:00:00.000Z'' }})
它什么也不返回。为了使其正常工作,我需要执行以下操作:
db.collection("log").find({ localHitDate: { ''$gte'': ISODate(''2013-12-12T16:00:00.000Z''), ''$lt'': ISODate(''2013-12-12T18:00:00.000Z'') }})
但是ISODate
在我的nodejs代码中无法识别。
那么,如何通过我的nodejs程序对mongo日期字段进行查询?
谢谢
答案1
小编典典你可以用new Date(''2013-12-12T16:00:00.000Z'')
在node.js
;
new
是必须的,因为Date()已经用于返回日期字符串。
ISODate是mongodb中的概念,您可以在mongodb控制台中使用它,但是对于不同的编程语言,它可能会有所不同。
node.js – 使用mongoose在mongodb中存储文件
我使用busboy模块将文件存储在特定文件夹中.这是我的代码
在路线:
router.post('/fileupload',function (req,res) { var fstream; req.pipe(req.busboy); console.log(req.pipe); console.log(req.busboy); req.busboy.on('file',function (fieldname,file,filename) { console.log("Uploading: " + filename); fstream = fs.createWriteStream('./files/' + filename); file.pipe(fstream); fstream.on('close',function () { res.redirect('back'); }); }); });
和我的前端:
<form method="post" action="/fileupload" enctype="multipart/form-data"> <input type="file" id="file" name="file"> <button type="submit">Submit</button> </form>
到目前为止没有错误.现在我只想将这些文件存储在数据库中.
接下来我该怎么办?
解决方法
根据您的工作,您现在需要一个mongoose插件,将您上传的文件存储到mongo GridFS中. GridFS在这里: – http://docs.mongodb.org/manual/core/gridfs/.您可以使用任何兼容的驱动程序访问网格 – mongoose和mongoose插件gridfs-stream就是一个例子 – 见这里:https://www.npmjs.org/package/gridfs-stream
我用下面的文件将文件保存到gridfs中.
var express = require('express'); var formidable = require('formidable'); var mongoose = require('mongoose'); var grid = require('gridfs-stream'); var fs = require('fs'); var util = require('util'); var app = express(); app.post('/fileupload',res) { var form = new formidable.IncomingForm(); form.uploadDir = __dirname + "/data"; form.keepExtensions = true; form.parse(req,function(err,fields,files) { if (!err) { console.log('File uploaded : ' + files.file.path); grid.mongo = mongoose.mongo; var conn = mongoose.createConnection('..mongo connection string..'); conn.once('open',function () { var gfs = grid(conn.db); var writestream = gfs.createWriteStream({ filename: files.file.name }); fs.createReadStream(files.file.path).pipe(writestream); }); } }); form.on('end',function() { res.send('Completed ..... go and check fs.files & fs.chunks in mongodb'); }); }); app.get('/',function(request,response){ response.send( '<form method="post" action="/fileupload" enctype="multipart/form-data">' + '<input type="file" id="file" name="file">' + '<input type="submit" value="submit">' + '</form>' ); }); app.listen(40000,function() { console.log('Express is listening on port 40000'); });
以上是关于如何在上传文件后继续进行的指南,它不是生产就绪的概念证明.请注意,我将busboy替换为强大的个人偏好.
继续前进是否有助于您?
SO1
node.js – 在MongoDB中存储日期和时区
我仍然对我认为是在这样的环境中存储和处理日期的正确方式感到自信.
我正在开发一个小应用程序,仅供意大利用户使用.
基本上,他们可以创建一个条目列表,每个都有一个creationDate(我只是对日期部分感兴趣,时间在我的场景中没有用).
因此,用户在“日期”表单字段中输入以下格式的日期:22/06/2014表示2014年6月22日.然后,日期被解析为:
entryData.dateEntry = moment( $(form).find('input[name=dateEntry]').val(),'DD-MM-YYYY' ).toDate();
最后,我的入口模型被添加到一个骨干js集合,并由MongoDB中的Node.js Express存储在服务器端.
查询Mongo的条目,我看到:
2014-06-21 22:00:00 0000
对应于“dateEntry”:日期(1403388000000).
搜索到的时候,我发现MongoDB没有时区的概念.所有日期都以UTC格式存储,我之前创建的日期对象为GMT 2.
但我真的很害怕…我怎么能把我当地时区的日期变成简单的方法?
接下来,我将以下划线模板显示条目数据:
<%= moment(dateEntry).format('DD/MM/YYYY') %>
和…voilà!我得到我当地的“意大利”日期:22/06/2014.
现在我的问题是,正确的方法吗?
过程是:本地时区的解析日期=>存储在utc =>检索当地时区的日期.这是常见的做法吗?
我还以为:我不能简单地避免使用时区和存储我的本地(意大利)时间,因为它是utc时间(2014-06-22 00:00:00)?那么糟糕吗
解决方法
如果你想只保存日期,你也可以这样做,但是我目前没有看到任何方式的损害 – 将所有内容保存在UTC中.我不确定node.js,但是您可以在某些设置中指定时区(意大利),所有的转换都将自动发生.你可能会发现这个线程很有用:
How can I set the default timezone in node.js?
今天关于如何在MongoDb中使用杰克逊将日期字段存储为ISODate和的分享就到这里,希望大家有所收获,若想了解更多关于golang解析mongodb中的ISODate类型、MongoDB + Nodejs:如何查询ISODate字段?、node.js – 使用mongoose在mongodb中存储文件、node.js – 在MongoDB中存储日期和时区等相关知识,可以在本站进行查询。
本文标签: