资讯专栏INFORMATION COLUMN

mongoose 操作备忘

happyhuangjinjin / 677人阅读

摘要:如果不存在则创建新记录。如果值为,执行验证。如果选项为,在新建时插入文档定义的默认值。以模式进行更新。禁用模式,允许覆盖记录示例更新多个为的文档将设置为更新多条数据与相同更新一条数据设置无效查找查询条件控制返回的字段控制选项回调函数。

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

安装mongoDB

安装文档: 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
我个人使用的是robomongo 当然还有特别多优秀的客户端,根据个人喜好选择

快速开始

mongoose官网

其实大部分都在官网写的十分详细,以备不时之需可以查阅

使用
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 http://mongoosejs.com/docs/co...

创建 Schema

详见 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

创建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: 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 表中 sizelarge 的数据

改(更新)

update: Model.update(conditions, doc, [options], [callback])

参数

conditions 查询条件 doc 要更新的文档
[options] 选项 [callback] 回调函数

注: 不能修改主键 _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

Model.updateMany

更新多条数据 与update相同

Model.updateOne

更新一条数据 设置 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(val)

query.limit(20)

skip 指定要跳过的条数
常用于分页 公式 skip = (page<页数> - 1) * pageSize<每页条数>;

Query#skip(val)

query.skip(100).limit(20)

sort 排序 降序 -1 升序 1

Query#sort(arg)

query.sort({ test: -1 }); // 将 query 降序排列

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19037.html

相关文章

  • 在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)

    摘要:如图连接成功后,显示你的数据库,在这个节目可以对数据库进行操作。如图安装与加载首先假定你已经安装了,命令行工具输入在使用的文件中即可。创建读取更新删除单值读取上文是在中基于对进行增删查改操作的简单介绍,以后会有进阶的文章。 关键词:mongodb安装 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查询,增加,修改,删除 工具介绍 Mon...

    lemon 评论0 收藏0
  • 在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)

    摘要:如图连接成功后,显示你的数据库,在这个节目可以对数据库进行操作。如图安装与加载首先假定你已经安装了,命令行工具输入在使用的文件中即可。创建读取更新删除单值读取上文是在中基于对进行增删查改操作的简单介绍,以后会有进阶的文章。 关键词:mongodb安装 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查询,增加,修改,删除 工具介绍 Mon...

    SillyMonkey 评论0 收藏0
  • MongoDB学习之Mongoose的使用

    摘要:文档是的核心概念,是键值对的一个有序集,在里文档被表示成对象。创建集合数据库中的集合名称当我们对其添加数据时如果已经存在,则会保存到其目录下,如果未存在,则会创建集合,然后在保存数据。使用创建,如下示例连接成功许巍男保存成功保存失败参考 mongoose简介 mongoose网站:https://mongoosejs.com/ 为什么要用Mongoose Mongoose就是一个让我们...

    qieangel2013 评论0 收藏0
  • Node.js操作MongoDB数据库

    摘要:使用操作是基于开发的驱动,可以在异步的环境下执行。比如,启动,直接在终端输入就可以启动啦默认运行在。还可以自定义端口或者输入的使用首先新建一个名为的文件夹,该文件夹就是数据库目录。 使用Mongoose操作MongoDB Mongoose是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。 关于在Mac下安装和使用MongoDB...

    chaosx110 评论0 收藏0
  • 「全栈初探」- Mongoose的简单使用

    摘要:下载依赖包完成项目创建,项目结构连接数据库在根目录下创建,输入以下代码,监听的几个事件,如果以上操作都没错的话,那么就会监听第一个事件事件,表示连接数据库成功,在最后,我们导出对象,以供其他模块使用。 一、准备工作 1. 启动mongo数据库 关于下载安装启动数据库我这里就不做过多解释,谷歌下会有很多教程,启动成功后的命令窗如下所示: showImg(https://segmentfa...

    vboy1010 评论0 收藏0

发表评论

0条评论

happyhuangjinjin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<