mongodb

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);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值