博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongoose 操作备忘
阅读量:7174 次
发布时间:2019-06-29

本文共 3994 字,大约阅读时间需要 13 分钟。

在使用node.js时,时常与之搭配的是mongoDB,一般我们不写原生mongo语法,一个经常使用的mongo库便是mongoose,由于个人记性比较差,用过就忘了,因此便记录一下常用增删改查api.

安装mongoDB

安装文档:

我是mac平台 用的是brew安装
更新 brew (官网上是这么写的 其实大可不必,直接跳过到第二步,会默认帮你更新)

brew update

brew install mongodb

其实到这里 就已经安装完了 并且可以启动了

  • 输入 表示启动服务

mongod --config /usr/local/etc/mongod.conf

  • 新起一个窗口启动

mongo

但是每次这样启动也很麻烦 我们配置一下

  • 创建数据目录

sudo mkdir -p /data/db

  • 进入安装目录

cd /usr/local/Cellar/mongodb/<这里是你安装时的版本号对应文件夹>/bin

  • 运行mongodb

mongod

  • 添加环境变量

export PATH=<安装路径>/bin:$PATH

把 <安装路径> 替换成你的, 比如我的 /usr/local/Cellar/mongodb/<这里是你安装时的版本号对应文件夹> , 其实和上面的路径对应

  • 搞定

输入 mongod 另起窗口输入 mongo

可视化工具

  • 官网

    我个人使用的是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, use openUri() instead, or set the useMongoClient option if using connect() or createConnection(). See

创建 Schema

详见

const Schema = mongoose.Schema;// 定义表模型的数据类型// required 必须的 接收一个 boolean 或者 functionconst 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

创建model

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:

Tank.create({ size: 'small' }, function (err, small) {  if (err) return handleError(err);  console.log(small._doc)})

这一方法比循环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 表中 sizelarge 的数据

改(更新)

update:

参数

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);});

更新多个 nameTobi 的文档 将 ferret 设置为 true

更新多条数据 与update相同

更新一条数据 设置 multi 无效

查找

find:

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 于 thenvar query = MyModel.find({ name: /john/i }, null, { skip: 10 })query.exec(function (err, docs) {});

findOne:

使用方法与 find 相同 只不过只返回第一个查询记录

findById:

根据 _id 字段查询

相关查询详见

比较查询操作符

  • $gt 大于(>)

  • $lt 小于(<)

  • $gte 大于等于(>=)

  • $lte 小于等于(<=)

  • $eq 等于(=)

  • $ne 不等于(!=)

  • 一个键对应多个值(在数组中)

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 同上取反

  • 不符合条件的文档

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 降序排列

转载地址:http://rzdzm.baihongyu.com/

你可能感兴趣的文章
压力测试工具JMeter入门教程
查看>>
MySQL 百万级分页优化 数据库优化
查看>>
np.concatenate 拼接
查看>>
PHP编译错误解决:Don't know how to define struct flock on this system, set --enable-opcache=no...
查看>>
Linux命令(6):more命令
查看>>
HTTPD配置文件MPM(非7.0以上版本)
查看>>
Upgrade GI/CRS 11.1.0.7 to 11.2.0.2. Rootupgrade.sh Hanging
查看>>
nginx的高级配置(5)——访问控制
查看>>
DG_Oracle DataGuard Switchover主备节点切换(案例)
查看>>
CentOS7系统常用命令
查看>>
10.2.0.1 db console启动失败问题一例
查看>>
linux下查看文件编码及修改编码
查看>>
VC中的延时
查看>>
算法与数据结构知识点
查看>>
在单位成功实验的PIX配置
查看>>
centos6.x使用dd命令制作u盘启动
查看>>
如何使用Wireshark抓包
查看>>
mysql 时间函数用法 集合
查看>>
技术宅男既要提升编程技术也要加强沟通能力
查看>>
开源计划--格瓦拉梦想(GUEVARA‘S DREAM)
查看>>