mongodb 学习笔记

基本概念

数据库(database)

数据库是一个仓库,在仓库中可以存放集合

集合(collection)

集合类似于数组,在集合中可以存放文档

文档(document)

文档是数据库中的最小单位,存储和操作的内容都是文档

  • MongoDB 中不需要手动创建数据库和集合
    • 当我们创建文档时,如果文档所在的集合或数据库中不存在会自动穿件数据库和集合

基本指令

  • show dbsshow databases 显示有多少个数据库
  • use 数据库名 进入到指定数据库中
  • db 当前所处的数据库
  • show collections 显示数据库中所有的集合

数据库中的(CRUD)增删改查操作

数据库中插入文档

db.<collection>.insert(doc)

db.<collection>.insertOne(doc) 只能插入一个文档

db.<collection>.insertMany(doc) 必须传多个,用数组阔起来

  • 向集合中插入文档

  • 例子:向 test 数据库总的,stus 集合中插入一个新的学生对象

    {name:"孙悟空",age:18,gender:"男"}

    db.stus.insert({name:"孙悟空",age:18,gender:"男"})

查询当前集合中所有的文档
  • db.<collection>.find()

    • find() 用来查询集合中所有符合条件的文档

    • find({}) 用来接受一个对象作为条件参数

      例如: db.stus.find({name:"dfs"}) 查询 name 为 dfs 的文档

    • find() 返回的是一个数组

  • db.<collection>.findOne() 用来查询集合中符合条件的第一个文档

    • findOne() 返回的是一个文档对象
  • db.<collection>.find().count() 查询符合条件的个数

进阶
# 1.mongodb支持直接通过内嵌文档的属性值进行查询
# 什么是内嵌文档:hobby就属于内嵌文档
{
	name:'liu',
	hobby:{
		movies:['movie1','movie2'],
		cities:['zhuhai','chengdu']
	}
}

db.users.find({hobby.movies:'movie1'}) //错误
db.users.find({"hobby.movies":'movie1'})//此时查询的属性名必须加上引号



#2.查询操作符的使用
#比较操作符
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$eq 等于的另一种写法

db.users.find({num:{$gt:200}}) #大于200
db.users.find({num:{$gt:200,$lt:300}}) #大于200小于300

$or 或者
db.users.find(
    {
        $or:[
            {num:{$gt:300}},
            {num:{$lt:200}}
        ]
    }
) #大于300或小于200


#3.分页查询
db.users.find().skip(页码-1 * 每页显示的条数).limit(每页显示的条数)

db.users.find().limit(10) #前10条数据
db.users.find().skip(50).limit(10) #跳过前50条数据,即查询的是第61-70条数据,即第6页的数据


#4.排序
db.emp.find().sort({sal:1}) #1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1}) #先按照sal升序排列,如果遇到相同的sal,则按empno降序排列

#注意:skip,limit,sort可以以任意的顺序调用,最终的结果都是先调sort,再调skip,最后调limit

#5.设置查询结果的投影,即只过滤出自己想要的字段
db.emp.find({},{ename:1,_id:0}) #在匹配到的文档中只显示ename字段

修改文档
  • db.<collection>.update(查询条件, 新对象) 默认情况下只改一个

    • 例子1 db.<collection>.update({name:"沙和尚"},{age:28}) 一般不这么用

      缺点: 查询到 name 为沙和尚的值 后 用 age:28 替换整个文档

    • 例子2 $set 修改文档的指定属性,没有就增加

      db.<collection>.update(
      	{"name":"沙和尚"},
      	{$set:{
      		gender:"男"
      	}}
      )
      

      优点:只修修改 gender 的字段

    • 例子3 $unset 删除文档的指定属性

      db.<collection>.update(
      	{"name":"沙和尚"},
      	{$unset:{
      		gender:"男"
      	}}
      )
      
  • db.<collection>.updateMany(查询条件, 新对象) 同时修改多个符合条件的文档

  • db.<collection>.updateOne(查询条件, 新对象) 只修改一个符合条件的文档

  • db.<collection>.replaceOne 替换一个文档

删除文档
  • db.<collection.remove()>

    • remove() 根据条件来删除文档,传递的条件跟find()一样。默认删除符合条件的所有文档

      db.stus.remove({_id:"hello"})
      

      注意:若只传入一个空集合,则会删除所有数据

  • db.<collection>.deleteOne() 删除一个

  • db.<collection>.deleteMany() 删除多个

文档间的关系

  • 一对一
  • 一对多
  • 多对多

一对多

#用户与订单:
db.users.insert([
{_id:100,username:'liu1'},
{_id:101,username:'liu2'}
])
db.orders.insert([
{list:['apple','banana'],user_id:100},
{list:['apple','banana2'],user_id:100},
{list:['apple'],user_id:101}
])

查询liu1的所有订单:
首先获取liu1的id: var user_id=db.users.findOne({name:'liu1'})._id;
根据id从订单集合中查询对应的订单: db.orders.find({user_id:user_id})

多对多

#老师与学生
db.teachers.insert([
    {
        _id:100,
        name:'liu1'
    },
    {
        _id:101,
        name:'liu2'
    },
    {
    	_id:102,
    	name:'liu3'
    }
])

db.students.insert([
	{
		_id:1000,
		name:'xiao',
		tech_ids:[100,101]
	},
	{
		_id:1001,
		name:'xiao2',
		tech_ids:[102]
	}
])

mongoose

简介

  • 1.mongoose是nodejs中的专门用于操作mongodb数据库的js库
  • 2.mongoose中的对象:
    • Schema 模式对象(用于约束文档的结构)
    • Model 模型对象(即mongodb中的集合)
    • Document 文档对象(即mongodb中的文档)

安装

npm i -s mongoose

连接数据库

// 1.引入mongoose
const mongooes = require("mongoose");
// 2.连接mongodb数据库
mongooes.connect("mongodb://localhost/users", {
    useNewUrlParser: true,
    useUnifiedTopology: true,
});

// 3.监听mongodb数据库的连接状态
// 绑定数据库连接成功事件
mongooes.connection.once("open", function () {
    console.log("连接成功");
});
// 绑定数据库连接失败事件
mongooes.connection.once("close", function () {
    console.log("数据库连接已经断开");
});

// 4.断开数据库连接(一般不用)
mongooes.disconnect();

创建模式对象和模型对象

const Schema=mongooes.schema;
//创建模式对象
const stuSchema=new Schema({
    name:String,
    age:Number,
    gender:{
        type:String,
        default:'female'
    },
    address:String
})
//创建模型对象
const StuModel=stuSchema.model("student",stuSchema); //第一个参数表示创建的集合的名称,第二个参数表示利用的模式对象

利用模型对象进行增删改查操作

添加操作
UserModel.create({ user_id: 100, name: "liu1" }, function (err) {
  if (!err) {
    console.log("插入成功");
  } else {
    console.log(err);
  }
});

let data = [
  { user_id: 101, name: "liu2", age: 22 },
  { user_id: 102, name: "liu3" },
];
UserModel.create(data, function (err) {
  console.log(arguments[1]); //第二个值表示的是所添加的文档对象,是一个数组
});
查询操作
/* 
    查询:
    model.find(conditions,[projection],[options],callback)
    conditions:查询的条件 
    projection:投影  { name: 1, gender: 1, _id: 0 } 或 'name gender -_id'
    options:查询选项  { skip: xx, limit: xx }   
 
    model.findOne(...)
    model.findById(...)

    model.countDocuments(conditions,callback) 查询文档的数量
 */

UserModel.find({}, function (err, data) {
  console.log(data);
});
UserModel.find(
  { name: /liu/i },
  "name gender -_id",
  { skip: 2, limit: 1 },
  function (err, data) {
    console.log(data); //返回的是一个文档对象数组
  }
);

UserModel.findById("5f9fbfba14319e492c0f5bc4", function (err, data) {
  console.log(data);
  console.log(data instanceof UserModel); //true 返回的文档对象属于模型对象(即集合)的实例对象
});

UserModel.countDocuments({}, function (err, data) {
  console.log(data);
});
修改操作
/* 修改:
    model.update(conditions,[doc],[options],callback)
        doc:修改后的文档对象
    model.updateMany(...)
    model.uodateOne(...)
*/
UserModel.updateOne({ name: "liu1" }, { $set: { age: 22 } }, function (
  err,
  data
) {
  if (!err) {
    console.log("修改成功");
  }
});

UserModel.find({ name: "liu1" }, function (err, data) {
  console.log(data);
});
删除操作
/* 
删除:
model.remove(conditions,callback)
model.deleteOne(...)
model.deleteMany(...)
*/
UserModel.remove(
  {
    name: "liu2",
  },
  function (err, data) {
    console.log("删除成功");
  }
);
UserModel.find({}, function (err, data) {
  console.log(data);
});

模块化处理

  • 1.单独创建一个数据库连接文件dbconncet.js
const mongooes = require("mongoose");
mongooes.connect("mongodb://localhost/mongooes_test", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
mongooes.connection.once("open", function () {
  console.log("连接成功");
});
  • 2.为每一个集合创建一个模型对象文件xxxModel.js
const mongooes = require("mongoose");
const Schema = mongooes.Schema;
const userSchema = new Schema({
  user_id: String,
  name: String,
  age: Number,
  gender: {
    type: Number,
    default: 0,
  },
});
const UserModel = mongooes.model("user", userSchema);
module.exports = UserModel;
  • 3.在最终的文件index.js中引入数据库库连接文件和创建模型的文件
const mongooes = require("./dbconncet");
const PostModel = require("./models/postModel");

PostModel.findOne({}, function (err, data) {
  if (!err) {
    console.log(data);
  }
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值