SHSubway项目笔记-mongoDB+node.js边用边学

最近在用mongoDB搭建可视化系统的数据库,记录一下使用过程中解决的问题

目录结构:

  • 1.将csv文件导入到mongoDB
  • 2.使用mongoose建Model时,集合名称自动加s变复数的问题
  • 3.mongoDB数据库中将时间从字符串格式转换成Date日期格式
  • 4.循环集合更新文档中的某些字段**
  • 5.node.js+mongoDB教程**

1.将csv文件导入到mongoDB

手头的原始数据是csv格式的,要用mongoDB数据库首先遇到的问题就是这样导入数据,使用mongoimport命令即可,具体命令如下:

mongoimport -d users -c contacts --type csv --file path/of/file/to/import.csv

其中:
-d: 即--db的缩写,将csv文件导入的数据库
-c: 即--collection的缩写,csv在数据库中保存的集合名称

更多可选参数信息见官方文档

  • 如果csv文件第一行是字段名称,则使用--headerline

mongoimport -d users -c contacts --file /path/of/file/to/import.csv --headerline

  • 如果csv文件没有字段名称,则使用--fieldFile另行指定字段名称所在文件,字段名文件中,每行写入一个字段,不需要用逗号分隔,字段文件的格式可以为csv, txt等。

mongoimport -d users -c contacts --file /path/of/file/to/import.csv --fieldFile /path/of/fieldfile.csv

【!】这里我遇到一个问题,在怎么运行以上命令都报错,SyntaxError: missing ; before statement。这时只要退出shell即可,以上命令是在mongoDB安装目录下运行的,而不是shell中。

导入json,tsv格式的文件也是类似的操作,详见官方文档

2.使用mongoose建Model时,集合名称自动加s变复数的问题

【问题描述】

在使用mongoose连接mongoDB数据库的过程中,先建Schema,再建Model,分别如下:

...
//建Schema
var MovieSchema = new mongoose.Schema({
    name: String,
    password: String
});
...
//建Model
var Movie = mongoose.model('Movie', MovieSchema);
...

这样写本以为会添加到数据库Movie集合中,实际操作时会在数据库中新建集合movies,并完成添加操作。

如果建Model时,如下这样写,则会正常添加到movies集合中(没有movies,则创建并添加)。

var Movie = mongoose.model('movies', MovieSchema);

【原因分析】

由以上现象可以推断mongoose在内部创建collection时将我们传递的collection名小写化,同时如果小写化的名称后面没有字母s,则会在其后面添加s,因此出现创建集合movies。

【解决办法】

只要在创建Schema和Model的时候稍加改动,就可以免去小写化和自动+s的困扰,创建方法如下:

var MovieSchema = new mongoose.Schema({
        name: String,
    password: String
},{collection:'movie'});
var card = mongoose.model('movie', MovieSchema , 'movie');

3.mongoDB数据库中将时间从字符串格式转换成Date日期格式

在数据库中,有同是String类型的日期字段和时间字段,如下图,现在想把它们组装成一个Date类型的字段。


最开始的时候我是这样写的

var newDate = new Date("2015-04-01 19:20:33");

但是一直提示Invalid Date,百思不得解,直到我在Stack Overflow上看到这个问题Converting string to date in mongodb,原来是字符串拼接的问题。

下面是可以正常完成转换的格式中的一种

var newDate = new Date("2015 04 01 19:20:33 +0800");

格式可以正常转换了,但是有遇到另外一个问题,转换前后的数据是下图这样的


转换后的时间刚好少了8小时,而UTC(世界标准时间)刚好比CST(中国标准时间)晚8小时,即Robomongo的默认显示是时间标准时间,可以在设置中调整为所在地时区,调整方法如下图


调整后的时间显示,如下图

4.循环集合更新文档中的某些字段

转换一个doc的时间问题解决了,那么怎么更新正个集合的时间呢,最开始我的想法是这样的

db.collectionName.find({}).forEach(function (doc) {
    doc.dateTime = new Date("dateJoinTIme");
    print( doc.dateTime );
});

但是shell报错

TypeError: db.getCollection(...).find(...).foreach is not a function

【解决办法】使用 "Bulk"

具体的使用方法如下,这里用到了我在3中提到的转换时间的方法:

var collection = db.getCollection('test');
var bulkOp = collection.initializeOrderedBulkOp();
var count = 0;
collection.find().forEach(function(doc) {
    //重新组装new Date()中的时间字符串
    var dd = doc.date.split('-');
    var newDate = new Date(dd[0]+' '+dd[1]+' '+dd[2]+' '+':'+doc.time+' +0800');

    //更新dateTime字段,没有此字段则添加字段
    bulkOp.find({ '_id': doc._id }).updateOne({
        '$set': { 'dateTime': newDate }
    });

    //删除文档中的某个字段
    bulkOp.find({ '_id': doc._id }).updateOne({
         '$unset': { 'time': doc.time }
    });

    count++;
    if (count % 100 === 0) {
        // 每100次操作后执行一次,并完成bulkOp的初始化
        bulkOp.execute();
        bulkOp = collection.initializeOrderedBulkOp();
    }
});
// 清理队列
if (count > 0) {
    bulkOp.execute();
}

5.node.js+mongoDB教程

在不断的遇到问题解决问题的过程中,查了一些书,不得不感慨技术更新换代太快,技术前进的速度远远超过了书的翻译速度,网上教程帮的很大忙,下面列举的这些教程不能说是完美无缺,但是在我搭建数据库和后台系统的过程中给了我很大的帮助,思路清晰明了,帮助我在极短的时间内快速上手。

mongoDB: 8篇mongoDB教程

express+mongoose: 目前14篇,还在更的一套比较完整的教程

node.js+mongoose: 一套简单的实现增删改查的样例


【参考资料】
mongoimport
CNode社区
4循环更新集合中的文档-Stack Overflow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容