Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mongodb与Mongoose的学习体会 #71

Open
youngwind opened this issue May 3, 2016 · 0 comments
Open

Mongodb与Mongoose的学习体会 #71

youngwind opened this issue May 3, 2016 · 0 comments
Labels

Comments

@youngwind
Copy link
Owner

youngwind commented May 3, 2016

原因

之所以要学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语法的掌握有待提高
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant