前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入浅出mongodb(二)

深入浅出mongodb(二)

作者头像
小丑同学
发布于 2020-09-20 12:10:01
发布于 2020-09-20 12:10:01
1.6K00
代码可运行
举报
文章被收录于专栏:小丑的小屋小丑的小屋
运行总次数:0
代码可运行

‍规划的根本目的是为了更快、更有效地达成目标。

前言

上篇文章<深入浅出mongodb(一)>阐述了mongoose的schememodel基础知识,有了上面的认知,我们开始下面的一系列骚操作,亲爱滴小伙伴们准备好了吗?

Are you Readly?

准备工作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let mongoose = require("mongoose");
let connection = require("./connection");

首先我们需要启动数据库,然后把mongoose库和connection引入,为我们连接数据库做准备。

创建集合‍‍‍‍‍‍‍‍‍‍

定义UserScheme数据结构和类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Scheme = mongoose.Scheme;
let UserScheme = new Scheme({
   name:String,
   age:Number
},{collection:'user'})

创建模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let UserModel = connection.model('User',UserScheme);

新建数据

下面我们通过遍历给新建的表添加几条测试数据,方便下面的操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(async  function(){
    let users = [];
    for(let i =1;i<=10;i++){
        users.push({id:i,name:`apple${i}`,age:i});
     }
     await UserModel.create(users)
})()

查询

查询全部

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async  function(){
    let result = await UserModel.create({name:"apple",age:1});
    console.log("result",result)
    let docs = await UserModel.find();
    console.log("docs",docs)
})()

按照属性过滤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async  function(){
    let docs = await UserModel.find({name:"apple1"});
    console.log("docs",docs)
})()

查找一条

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async  function(){
    let docs = await UserModel.findOne({});
    console.log(docs);
})()

通过ObjectId查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async  function(){
    let docs = await UserModel.findById("5e3a21d5a8019b2c0c157373")
    console.log(docs);
})()

条件查询

条件

符号

大于

gt

小于

lt

大于等于

ge

不等于

ne

包含

in

  • 大于gt查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async  function(){
    let doc = await UserModel.find({'age':{'$gt':5}})
    console.log(docs);
})()
  • 包含in
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(async  function(){
   let docs = await UserModel.find({'age':{'$in':[5,6,7]}})
   console.log(docs)
})()
  • 小于7或者小于3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  (async  function(){
     let docs = await UserModel.find({'$or':[{'age':{'$gt':7}},{'age':{'$lt':3}}]})
     console.log(docs)
  })()
  • 分页
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(async  function(){
    let pageSize = 3;
    let pageNumber = 2;
    let docs = await UserModel.find({}).sort({age:-1}).skip((pageNumber-1)*pageSize).limit(pageSize);
   console.log(docs)
})()

每页3条 查询第2页 1 2 3 4 5 6 7 8 9 10

  • sort 指定排序的字段和升序还是降序 1,-1
  • skip 指定跳过几条,忽略几条
  • limit 限定返回的最大条数

更新

update有两个参数,第一个参数是条件,第二个参数是更新后的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(async  function(){
    let result = await UserModel.update({name:"apple"},{name:"orange"});
    console.log(result);
})()

n是匹配的条件 nModified表示实际发生更新操作的条数

更新还涉及到updateOneupdateMany

  • updateOne顾名思义如果找到多条记录,则只更新一条。
  • updateMany同理如果找到多条记录,则更新所有匹配的记录

删除

删除是艰巨的任务,毕竟删库跑路一直都备受关注,所以在使用的时候一定要小心☠。

  • 默认的情况下remove删除所有匹配的记录。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  (async  function(){
       let result = await UserModel.remove({name:"orange"})
       console.log(result);
  })()

  • eleteOne删除第一条 后面不再匹配 更不会删除
  • eleteMany删除所有的匹配的条数
  • ulkWrite于批量插入,修改,删除操作

联表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let ScoreSchema = new Schema({
    uid:{type:mongoose.Schema.Types.ObjectId,ref:'User'},
    grade:Number
})
let Score = connection.model("Score",ScoreSchema);
(async  function(){
    let user = await User.create({name:"pear"}); //先创建主表
    console.log(user);
    let score = await Score.create({uid:user._id,grade:100});
    console.log(score);
})()

我们在上面的准备工作里创建了一个UserScheme集合结构,在这里我们又创建ScoreSchema的表结构,在ScoreSchema结构里面uid是一个外键,类型是一个ObjectId类型,用于标志存储数据的唯一性。使用了一个ref的类型是引用的User模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(async function(scoreId){
    let score = await Score.findById(scoreId).populate('uid');
    console.log(score);
})("5f22712e78f5d73c7cae4b2f")

上图使用了populate是填充的意思 就是把一个外键字段 从一个ObjectId变成另外一个字段来实现联表查询。

最后

本文结束,有什么问题和有错误的地方,欢迎大家的留言和评论,还有后续更新,下期更加精彩 ???

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小丑的小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 准备工作
    • 创建集合‍‍‍‍‍‍‍‍‍‍
    • 创建模型
    • 新建数据
  • 查询
    • 查询全部
    • 按照属性过滤
    • 查找一条
    • 通过ObjectId查询
    • 条件查询
  • 更新
  • 删除
  • 联表
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档