mongoose.js 基础使用——Models

Models

Models 是从 Schema 编译来的构造函数。它们的实例就代表着可以从数据库保存和读取的 documents。从数据库创建和读取 document 的所有操作都是通过 model 进行的。

编译model

var schema = mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);

第一个参数是跟 model 对应的集合( collection )名字的 单数 形式。 Mongoose 会自动找到名称是 model 名字 复数 形式的 collection 。 对于上例,Tank 这个 model 就对应数据库中 tanks 这个 collection.model() 这个函数是对 schema 做了拷贝(生成了 model)。 你要确保在调用 .model() 之前把所有需要的东西都加进 schema 里了!

Documents 是model 的实例。

新增

创建它们并保存到数据库非常简单:

var Tank = mongoose.model('Tank', yourSchema);

var small = new Tank({ size: 'small' });
small.save(function (err) {
  if (err) return handleError(err);
  // saved!
})
// or
Tank.create({ size: 'small' }, function (err, small) {
  if (err) return handleError(err);
  // saved!
})

查询

用 mongoose 查询文档相当容易啦,它支持 MongoDB 的高级( rich )查询语法。 查询文档可以用 model 的 find,findById,findOne, 和 where 这些静态方法。

find

基本语法:MyModel.find(conditions, [projection], [options], [callback])

  • conditions 查询条件
  • projection 需返回的字段
  • options 查询配置选项
  • callback 查询回调,回调函数中传入两个形参[err, docs]

执行完成后可以返回 Query 对象,下面是示例:

// name值john且年龄大于等于18
MyModel.find({ name: 'john', age: { $gte: 18 }});

// 查询名字中包含hn字母,并且仅返回 name与 friends 字段
MyModel.find({ name: /hn/i }, 'name friends', function (err, docs) { })

// 跳过10条查询
MyModel.find({ name: /hn/i }, null, { skip: 10 })

其中合法配置项有(不全):

  • sort 值1则表示升序,降序则设置为 -1。{key:1, title:-1}
  • limit 接受一个数字,表示指定读取记录条数
  • skip 接受一个数组,表示跳过条数再查找
  • lean 转换mongoose查询结果类型,从MongooseDocuments转换为JS Object,从而便于我们修改查询结果。(false)
findById

通过_id字段查找单个文档。findById(id)几乎等同于findOne({_id:id})
基本语法:MyModel.findById(id, [projection], [options], [callback])

  • id 依据数据库里_id
  • projection 需返回的字段
  • options 查询配置选项
  • callback 查询回调,回调函数中传入两个形参[err, docs]
MyModel.findById(id, function (err, adventure) {});
findOne

与find 类似,但查询条件是可选的,如果为null或为填写,将返回任意一条文档
基本语法:MyModel.findOne([conditions] [projection], [options], [callback])

  • conditions 查询条件
  • projection 需返回的字段
  • options 查询配置选项
  • callback 查询回调,回调函数中传入两个形参[err, docs]

删除

remove

modelremove 方法可以删除所有匹配查询条件( conditions )的文档。可以考虑是使用single选项,仅删除一条
基本语法:MyModel.remove(conditions, [callback])

  • conditions 删除条件
  • callback 删除回调,回调函数中传入一个形参[err,]
removeOne

同上,但仅会删除一条文档

deleteMany

同上,但不考虑single选项

更新

update

更新数据库中的一个文档而不返回它,该函数的执行会触发update()中间件。
基本语法:MyModel.update(conditions, doc, [options], [callback])

  • conditions 更新条件
  • doc 需要更新的字段值
  • options 更新配置项
  • callback 查询回调,回调函数中传入两个形参[err, docs]
MyModel.update({ name: 'Tobi' }, { ferret: true }, { multi: true }, function (err, raw) {
  if (err) return handleError(err);
  console.log('The raw response from Mongo was ', raw);
  /** {
  acknowledged: true,
  modifiedCount: 2,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 2
  }*/
});

其中合法的配置项有:

  • safe 安全模式(默认为模式中设置的值(true))
  • upsert 如果不匹配,是否创建文档(false)
  • multi 是否应更新多个文档(false)
  • runValidators
  • setDefaultsOnInsert
  • strict
  • overwrite 禁用 update-only 模式,允许你替换整个文档 (false)
  • err
  • rawResponse
updateMany

同上,但没有multi 选项

updateOne

同上,但仅更新一个

更多

count

统计数据库集合中匹配文档的数量。
基本语法:MyModel.count(conditions, [callback])

  • conditions 查询条件
  • callback 查询回调,回调函数中传入两个形参[err, count]
    示例:
MyModel.count({ type: 'jungle' }, function (err, count) {
  if (err) ..
  console.log('there are %d jungle adventures', count);
});

操作符

查询和投影运算符

比较查询运算符
  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte
  • (!=) 不等于 $ne
  • (=) 等于 $eq
逻辑查询操作符
  • ($and) 多字段查询
  • ($or) 多字段查询 {$or : [{key01 : value01}, {key02 : value02}, ...]}
  • ($not)
  • ($nor)
元素查询操作符

赋值查询操作符

地理空间操作符

数组查询操作符

位运算操作符

投影操作符

混合查询操作符

更新操作符

字段更新操作符
  • $currentDate
  • $inc
  • $min
  • $max
  • $mul
  • $rename
  • $set
  • $setOnInsert
  • $unset
数组更新操作符
  • $(update)
  • $[]
  • $[<identifier>]
  • $addToSet
  • $pop
  • $pull
  • $push
  • $pullAll
  • $each
  • $position
  • $slice
  • $sort
位运算更新操作符

聚合管道阶段

聚合管道操作符

模糊查询

查询 title 包含“教”字的文档:

MyModel.find({title:/教/})

查询 title 包含“教”字开头的文档:

MyModel.find({title:/^教/})

查询 title 包含“教”字结尾的文档:

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

推荐阅读更多精彩内容