[Node][NoSql]MongoDB轻度使用(不入门只入土)

[Node][NoSql]MongoDB轻度使用(不入门只入土)

对比

因业务需要赶紧啃一手MongoDB,大致过了一遍,对比主流关系型数据库,MongoDB主要有这些不同:

  • 列是动态的,更适合存储不定属性的对象(如某些不同业务的聚合统计);
  • 原生支持js方法调用形式的写法,当然坏处是相对的,只能背API,没办法用通用的sql方法;
  • 不支持事务、回滚,这也限定了MongoDB不适合强一致性的场景(基本只用来存插入的业务记录好了,更新都不要想了),没有join,不适合业务复杂的场景;
  • 贵(特指某里云),好在服务可以自建,不考虑高可用的情况下负担可以接受;
  • 其他特性和不同我暂时考虑不到。

简单使用

怎么直接就入了土呢?我的业务主要用到一个MapReduce,一个find,一个upsert。然后结合实际的使用,总结了一些坑点:

  • 请用最新的包(目前是3.3.2),不要用2.x的包。一个是内部环境的问题,这个后面会和MapReduce的坑一起讲;再一个是解析问题,connect的时候新包会提示你打开使用新解析方式的选项,而且后续会废弃掉旧的解析方式,所以旧包应该是有这方面问题的。
  • 可视化工具win下用的是Robo 3T,一个坑点在于如果是通过ssh连跳板机到线上,本地生成sshkey时,需要指定pem的生成模式,否则是连不上的。(sshkey有机会再讲)

具体应用的话,find相当于select;updateOne带一个upsert的参数,这样就相当于sql中的insert on duplicate key,但是可以指定匹配键,而非sql中的索引键;这些是比较常用且比较基础的用法。

mapReduce

比较重要的就是这个MapReduce了,主要就是用作数据分析:map的过程根据一定条件将原始数据映射到不同的集合(集合内只有一个元素时不走reduce,因此设计返回值时,map的结构应该尽量和reduce保持一致),reduce过程将每个集合按一定方式处理成想要得到的分析维度。举一个简单的例子:

db.collection('test').mapReduce(function(){
  emit(this.id % 10, {
    count: 1,
    avgScore: this.score
  })
}, function(key, values){
  const res = {
    count: 0,
    sum: 0,
    avgScore: 0
  }
  values.forEach(value => {
    res.count += value.count
    res.sum += value.score
    res.avgScore += value.score
  })
  res.avgScore /= values.length
  return res
}, {})

这一段,map部分,将test表的所有元素按id模10的结果分组;reduce部分,计算了每个组内成绩的平均值;我这里假设样本足够均匀,id从0到9都有结尾的,那么最终的结果就是一个这样的数组:

[{key: 0, value: { count: 1, avgScore: 20 }}, {key: 1, value: { count: 4, sum: 216, avgScore: 54 }}, ...{key: 9, value: { count: 5, sum: 195, avgScore: 39 }}] // length: 10

可以注意到,生成的结果是一个列表,其中每一个元素都是一个对象,都有key和value两个属性。key是在map中指定的,emit的第一个参数;value则是reduce的返回值,如果map映射到的只有一个数据,那么emit的第二个参数直接作为结果对象的value属性(如例子中的第一个结果,只匹配到一个数据,因此不走reduce,也就没有sum属性)。
这里注意到map函数内有一个this.id,这个id是怎么this出来的?为什么在map函数里面console.log会报错?为什么不能传参数进去?
都是因为:map,reduce这两个部分的函数,是作为参数传进mapReduce函数里面的,传入后会toString掉,在MongoDB内部环境执行。这也是为什么上一节说到,要使用高版本的npm包,因为2.x版本的包只支持到es5的语法,如果一定要用老包的话,代码会写得很难看(然后被自己嫌弃(误,明明是被cr掉
如果我真的要传参数进去呢?确实是可以的。传入的参数可以是函数,也可以是字符串,所以……

function map (options) {
  return function temp () {
    const options = JSON.parse('$options')
    switch (options) {
      // ...
    }
    emit(key, value)
  }.toString().replace('$options', JSON.stringify(options))
}

所以就直接传字符串好了,当然也还是有一些限制,没办法用全局变量,没办法传入构成循环指向的对象,还是没有console……

要问到底为什么入土

就是效率比较低,当然也有可能和我没有建好索引,或者map、reduce函数写得不好有关系。目前的话,大概100k左右的数据量就会崩掉。10k左右的数据量,CPU单核会跑满。
确实优点还是有,insert on duplicate key不需要提前建立索引,不需要考虑字段类型,容量扩展较方便,mapReduce甚至可以直接写js,虽然有些鸡肋,但是心智负担确实比写sql的group by稍稍低一些……呸,我有这时间折腾这玩意,业务早写完了……
(完)

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

推荐阅读更多精彩内容