在使用node.js时,时常与之搭配的是mongoDB,通常咱们不写原生mongo语法,一个常常使用的mongo库即是mongoose,因为我的记性比较差,用过就忘了,所以便记录一下经常使用增删改查api.javascript
安装文档: mongoDB安装
我是mac平台 用的是brew安装
更新 brew (官网上是这么写的 其实大可没必要,直接跳过到第二步,会默认帮你更新)html
brew update
brew install mongodb
java
其实到这里 就已经安装完了 而且能够启动了node
输入 表示启动服务mongodb
mongod --config /usr/local/etc/mongod.conf
数据库
新起一个窗口启动api
mongo
数组
可是每次这样启动也很麻烦 咱们配置一下promise
建立数据目录安全
sudo mkdir -p /data/db
进入安装目录
cd /usr/local/Cellar/mongodb/<这里是你安装时的版本号对应文件夹>/bin
运行mongodb
mongod
添加环境变量
export PATH=<安装路径>/bin:$PATH
把 <安装路径> 替换成你的, 好比个人 /usr/local/Cellar/mongodb/<这里是你安装时的版本号对应文件夹> , 其实和上面的路径对应
搞定
输入 mongod
另起窗口输入 mongo
官网 robomongo
我我的使用的是robomongo 固然还有特别多优秀的客户端,根据我的喜爱选择
其实大部分都在官网写的十分详细,以备不时之需能够查阅
const mongoose = require('mongoose') // 可用于监测数据库状态 const db = mongoose.connection // 链接数据库 test 表 若是不存在也不要紧 mongoose.connect('mongodb://localhost/test', { useMongoClient: true }); // 用于解决警告 mongoose.Promise = global.Promise;
解释:
{ useMongoClient: true } 用于解决以下警告
(node:2772) DeprecationWarning:
open()
is deprecated in mongoose >= 4.11.0, useopenUri()
instead, or set theuseMongoClient
option if usingconnect()
orcreateConnection()
. See http://mongoosejs.com/docs/co...
详见 Schema
const Schema = mongoose.Schema; // 定义表模型的数据类型 // required 必须的 接收一个 boolean 或者 function const blogSchema = new Schema({ title: {type: String, required: true}, author: String, age: { type: Number, min: 18, max: 65 }, comments: [{ body: String, date: Date }], date: { type: Date, default: Date.now },// default 默认当前时间戳 hidden: Boolean, meta: { votes: Number, favs: Number } });
支持的类型
String
Number
Date
Buffer
Boolean
Mixed
ObjectId
Array
var Blog = mongoose.model('Blog', blogSchema);
注: 文档中在声明方法的时候不要使用箭头函数
经过上面的步骤其实已经建立了表模型 建立一个文档并保存到数据库很是简单
方法一:
var Tank = mongoose.model('Tank', yourSchema); var small = new Tank({ size: 'small' }); small.save(function (err, doc) { if (err) return handleError(err); console.log(doc) })
create: Model.create(doc(s), [callback])
Tank.create({ size: 'small' }, function (err, small) { if (err) return handleError(err); console.log(small._doc) })
Model.insertMany(doc(s), [options], [options.ordered, [options.rawResult, [callback])
这一方法比循环create
快 由于它只向服务器发送一个操做
var arr = [{ name: 'Star Wars' }, { name: 'The Empire Strikes Back' }]; Movies.insertMany(arr, function(error, docs) {});
Tank.remove({ size: 'large' }, function (err) { if (err) return handleError(err); });
删除 Tank 表中 size
为 large
的数据
update: Model.update(conditions, doc, [options], [callback])
参数
conditions
<Object> 查询条件 doc
<Object> 要更新的文档[options]
<Object> 选项 [callback]
<Function> 回调函数
注: 不能修改主键 _id
options 有以下选项:
safe (boolean): 默认为true。安全模式。
upsert (boolean): 默认为false。若是不存在则建立新记录。
multi (boolean): 默认为false。是否更新多个查询记录。
runValidators: 若是值为true,执行Validation验证。
setDefaultsOnInsert: 若是upsert选项为true,在新建时插入文档定义的默认值。
strict (boolean): 以strict模式进行更新。
overwrite (boolean): 默认为false。禁用update-only模式,容许覆盖记录
示例
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); });
更新多个 name
为 Tobi
的文档 将 ferret 设置为 true
更新多条数据 与update相同
更新一条数据 设置 multi 无效
find: Model.find(conditions, [projection], [options], [callback])
conditions
:查询条件;projection
:控制返回的字段;options
:控制选项;callback
:回调函数。
示例
// 命名 john age 大于等于 18 只返回 title 与 author 字段 skip 跳过 10 条 MyModel.find({ name: 'john', age: { $gte: 18 }},{title: 1, author: 1}, { skip: 10 }, function (err, docs) {}); // 返回一个query对象 相似于 promise exec 于 then var query = MyModel.find({ name: /john/i }, null, { skip: 10 }) query.exec(function (err, docs) {});
findOne: Model.findOne([conditions], [projection], [options], [callback])
使用方法与 find 相同 只不过只返回第一个查询记录
findById: Model.findById(id, [projection], [options], [callback])
根据 _id 字段查询
相关查询详见 mongoDB
$gt 大于(>)
$lt 小于(<)
$gte 大于等于(>=)
$lte 小于等于(<=)
$eq 等于(=)
$ne 不等于(!=)
$in 一个键对应多个值(在数组中)
Model.find( { qty: { $in: [ 5, 15 ] } } ) // 查询 qty 等于 5 或者 15 的文档
$nin 同上取反, 一个键不对应指定值
$or 多个条件匹配, 能够嵌套 $in 使用
Model.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } ) // 查询 quantity 小于 20 或者 price 等于 10 的文档
$nor 同上取反
$not 不符合条件的文档
Model.find( { price: { $not: { $gt: 1.99 } } } ) // price 不大于 1.99的
$and 与
limit 指定返回的最大条数
query.limit(20)
skip 指定要跳过的条数
经常使用于分页 公式 skip = (page<页数> - 1) * pageSize<每页条数>;
query.skip(100).limit(20)
sort 排序 降序 -1 升序 1
query.sort({ test: -1 }); // 将 query 降序排列