Mongoose遇坑记

日期:2015-8-10 18:51 | 标签: mongoose Node | 阅读:697

初次使用,就算是简单的hello world程序都会遇坑。
doc: http://mongoosejs.com/docs/guide.html
mongodb doc:https://docs.mongodb.com

Mongoose是什么

Mongoose 是 MongoDB 的 ODM(Object Document Mapper)。ODM类似ORM,都是将数据库的数据转化为代码对象的库,使用转化后的对象可以直接对数据库的数据进行CRUD(增删改查)。

名词解释

mongoose使用严格命名方式

// 文本属性
var xxxSchema;   
// 数据库模型,由Schema构造具有数据库行为模型,相当于管理数据库属性、行为的类
var xxxModel;    
// 实体,是具有具体的数据库操作CRUD的
var xxxEntity;  
xxxEntity.save();  //执行完成后,数据库就有该数据了
xxxEntity.find(function(err,doc){
      // todo
});

Schema的扩展

  1. 实例方法
  2. 静态方法,在Model层即可使用
  3. 索引
  4. 虚拟属性,不会写入数据库
  5. 配置项,new Schema(config,options);config可以包含safe、strict、capped、versionKey、autoIndex

混合类型

xxx.anything = {prop:[{a:1},2,{c:'iamc'}]}
//必须调用这个,表示该属性类型发生变化
xxx.markModified('anything');
xxx.save();

数据库打开

使用这几行代码,可以打开数据库却无法操作数据库

var mongoose = require('mongoose');
mongoose.createConnection('localhost', 'test');

换成如下代码后成功

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

原因:
如果使用mongoose.connect的话,它连接的是default connection;而如果是db = mongoose.createConnection(xxxx)的话,因为它返回的是一个connection,所以接下来再进行model生成的时候需要使用 db.model 而不是 mongoose.model

populate

表关联查询
参考:https://segmentfault.com/a/1190000002727265

update

更新mixed类型

下述这个方法是 查找->修改->标记 这几个步骤来进行的。
https://segmentfault.com/q/1010000004241850

更新子文档

其实mongoose还是提供了一系列的便捷方法: mongoose-find-update-subdocument from stackoverflow

找不到mongoose模块

后来发现是把module.exports写成model.exports,但是报错信息不能乱讲不是?!话说,自己也挺笨的!

表名称怎么来的,至今不懂!

我在数据库中事先建好了一张表,然后在程序中也指定了表名称,结果硬是自动创建了一张复数的表。

crawler

在该项目中不同文件引用了 相同的 Model 对象,发现存在 model 冲突,此外,有 find select 不受控制的现象。稍微修改数据库结构则修复了该问题。

参考

http://ourjs.com/detail/53ad24edb984bb4659000013

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式