Mongodb与Mongoose的学习体会

@youngwind 2016-05-03 02:26:15发表于 youngwind/blog Nodejs

原因

之所以要学mongo,是因为自己要写一个githubStarManager,见 #70 ,以前用过mysql和sequelize,这次基于两个原因选用了mongo。

  1. 我要从github公共api上抓数据,用mongo的话能够直接存储返回的json数据,不需要再拆分字段。
  2. 之前一直听说mongo,也想试试新鲜事物。

如何快速上手一种数据库?

经过之前mysql和sequelize的学习, #43, #44 , 我总结出了快速学习一门数据库的几个基本步骤。

  1. 安装数据库本身
  2. 学会在命令行中直接操作数据库。(这一点非常重要,因为这可以促使我们深刻理解数据库的定义和组织方式。即便在后面我们很少用这些命令行)
  3. 根据语言的不同,选择相应的原生的驱动。比如同样是在nodejs下,mysql用mysql包,mongo有mongodb包。这些包虽然跟后面的orm相比,用起来很不方便,代码写起来更长,但是正是通过这些还没有封装得很抽象的包,可以让我们渐渐熟悉数据库的调用方式。
  4. 选用一个合适的orm。比如mysql对应的sequelize,mongo对应的mongoose,这些orm的封装程度很高,使用它们可以给我们提供很多方便。
  5. 选择一个可视化操作工具。比如mysql的Navicat Premium和mongo的mongobootster,可视化的工具让我们查看数据库更加直观。

mongo相关

下面是用mongo的时候碰到的一些问题。

1. collection与documents

因为平常我们用惯了sql型的数据库,对于nosql型的理解起来很困难,你可以这么理解,mongo里面的collection对应一张表,document对应表中的一行数据,每一行都会有一个_id属性作为唯一性的标志。

2. /data/db权限问题

mongo默认是把数据库建在/data/db文件夹下,但是刚开始新建的时候可能会出现权限不足的error。

Unable to create/open lock file: /data/mongod.lock errno:13 Permission denied

解决方案:
sudo chown -R /data/db

参考链接:http://stackoverflow.com/questions/15229412/unable-to-create-open-lock-file-data-mongod-lock-errno13-permission-denied

3. 高级的orm语法

我在用数据库的时候一直就只会那么几个最基本的增删改查,但是在实际项目中你会发现有更复杂的需求,单靠这几个的话代码会写得很不优雅。
比如我现在要实现这么一个功能。查找某document是否存在,如果存在则更新它,如果不存在,则插入
如果我直接用最基本的增删改查的话,会很麻烦。mongoose提供了更抽象的方法:findOneandUpdate

遗留问题

  1. 对数据库和数据结构的设计还很不成熟。
  2. 对高级orm语法的掌握有待提高