mongodb简介
MongoDB 是一个开源的 NoSQL 数据库,相比 MySQL 那样的关系型数据库,它更显得轻巧、灵活,非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储(文档,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。),数据格式就是JSON。
Mongoose
Mongoose 是 MongoDB 的一个对象模型工具,是基于 node-mongodb-native 开发的 MongoDB nodejs 驱动,可以在异步的环境下执行。同时它也是针对 MongoDB 操作的一个对象模型库,封装了MongoDB 对文档的的一些增删改查等常用方法,让 NodeJS 操作 Mongodb 数据库变得更加灵活简单。
Mongoose,因为封装了对MongoDB对文档操作的常用处理方法,可以高效的操作mongodb,同时可以理解mongoose是一个简易版的orm ,提供了类似schema定义,hook、plugin、virtual、populate等机制,让NodeJS操作Mongodb数据库变得特别简单!
- 安装mongoose
$ npm install --save mongoose
- 引用mongoose
var mongoose = require("mongoose");
- 使用"mongoose"连接数据库
var db = mongoose.connect("mongodb://user:pass@ip:port/database");
Models
Models 是从 Schema 编译来的构造函数。它们的实例就代表着可以从数据库保存和读取的 documents。从数据库创建和读取 document 的所有操作都是通过 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
model 的 remove 方法可以删除所有匹配查询条件( 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);
});