深入浅出mongodb(二)

时间:2022-07-25
本文章向大家介绍深入浅出mongodb(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

前言

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

Are you Readly?

准备工作

let mongoose = require("mongoose");
let connection = require("./connection");

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

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

定义UserScheme的数据结构和类型。

const Scheme = mongoose.Scheme;
let UserScheme = new Scheme({
   name:String,
   age:Number
},{collection:'user'})

创建模型

let UserModel = connection.model('User',UserScheme);

新建数据

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

(async  function(){
    let users = [];
    for(let i =1;i<=10;i++){
        users.push({id:i,name:`apple${i}`,age:i});
     }
     await UserModel.create(users)
})()

查询

查询全部

(async  function(){
    let result = await UserModel.create({name:"apple",age:1});
    console.log("result",result)
    let docs = await UserModel.find();
    console.log("docs",docs)
})()

按照属性过滤

(async  function(){
    let docs = await UserModel.find({name:"apple1"});
    console.log("docs",docs)
})()

查找一条

(async  function(){
    let docs = await UserModel.findOne({});
    console.log(docs);
})()

通过ObjectId查询

(async  function(){
    let docs = await UserModel.findById("5e3a21d5a8019b2c0c157373")
    console.log(docs);
})()

条件查询

条件

符号

大于

gt

小于

lt

大于等于

ge

不等于

ne

包含

in

  • 大于gt查询
(async  function(){
    let doc = await UserModel.find({'age':{'$gt':5}})
    console.log(docs);
})()
  • 包含in
(async  function(){
   let docs = await UserModel.find({'age':{'$in':[5,6,7]}})
   console.log(docs)
})()
  • 小于7或者小于3
  (async  function(){
     let docs = await UserModel.find({'$or':[{'age':{'$gt':7}},{'age':{'$lt':3}}]})
     console.log(docs)
  })()
  • 分页
(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有两个参数,第一个参数是条件,第二个参数是更新后的值

(async  function(){
    let result = await UserModel.update({name:"apple"},{name:"orange"});
    console.log(result);
})()

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

更新还涉及到updateOneupdateMany

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

删除

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

  • 默认的情况下remove删除所有匹配的记录。
  (async  function(){
       let result = await UserModel.remove({name:"orange"})
       console.log(result);
  })()
  • eleteOne删除第一条 后面不再匹配 更不会删除
  • eleteMany删除所有的匹配的条数
  • ulkWrite于批量插入,修改,删除操作

联表

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模型

(async function(scoreId){
    let score = await Score.findById(scoreId).populate('uid');
    console.log(score);
})("5f22712e78f5d73c7cae4b2f")

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

最后

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