Loading

MongoDB学习笔记

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

无模式, 灵活的文档类型, 无需固定的结构.

命名规则
  1. 不能是空字符串.
  2. 不能包含空字符.
  3. 不能使用system前缀, 因为是系统保留的.
  4. 建议不包含$.
mongodb对比MySQL
mongo概念 MySQL概念 说明
database database 数据库
collection table 集合 - 表
document row 数据行 - 文档
field column 字段 - 属性
index index 索引
嵌入文档 join 使用嵌入式的文档来代替关联查询
primary key primary key mongodb自动生成主键 _id
基本指令
  1. show dbs
  2. show databases

显示当前的所有数据库.

  1. use 数据库名.

进入到指定的数据库中.

  1. db

表示当前所处的数据库.

  1. show collections

显示数据库中所有的集合.

数据库的增删改查.
  1. 向数据库中插入一个文档

db.{collection}.insert(document).

例: db.company.insert({name: 'zhangsan', age: 18, gender: 'male'})

插入多个:

db.company.insert([{name: 'lisi', age: 20, gender: 'male'}, {name: 'lulu', age: 18, gender: 'female'}])

db.company.insert([{name: 'zhangwen', age: 23, gender: 'male'}, {name: 'liwen', age: 25, gender: 'female'}, {name: 'zhou', gender: 'female'}])

_id是可以自己指定的, 但是自己指定的话, 是要确保唯一.

db.company.insert({_id: 123, name: 'zhang', age: 18, gender: 'male'})

其他方法:

insertOne()插入1个, insertMany()插入多个. 语义明确, 易懂.

  1. 查询文档

db.{collection}.find(): 用于查询集合中所有的文档. 可以接收一个对象作为查询的条件.

例: 查询年龄是18岁的人.

db.company.find({age: 18.0})

findOne(): 返回查询到的第一个.

count(), length()查询结果的数量.

查询指定字段.再查询条件后再加一个对象, 指明你想要的字段. 不想要的值赋予0.

db.company.find({age: 18.0}, {name: 1, _id: 0})

常用的比较运算符: $gt: 大于, $lt: 小于, $gte: 大于等于, $lte:小于等于 , $ne: 不等于

db.company.find({age: {$ne: 20}})

  1. 更新.

db.{collection}.update(查询条件, 新对象). update默认只更新第一个, 要更新多个加上multi参数. 设置为true

例: 将liwen的名字改成liwenwen.

注意: 它会将新对象替换你查询条件查出来的.

使用更新操作符: $set: 修改文档中指定字段的值.

db.company.update({name: 'lulu'}, {$set: {age: 23}})

$unset: 删除文档指定字段.

db.company.update({_id: 123}, {$unset: {age: 1}})

updateMany(): 更新多个. 等价于update加上multi.

updateOne(): 只更新一个.

  1. 删除.

db.{collection}.remove() 删除符合条件的所有.

删除一个justOne. 传true. 则只删除一个.

必须传递参数, 不传参会报错, 如果传递一个{}, 则删除所有.

db.{collection}.deleteOne(): 删除一个.

db.{collection}.deleteMany(): 删除多个.

db.{collection}.drop() : 删除集合.

db.{collection}.dropDatabase(): 删除数据库.

一般业务中只做逻辑删除.

  1. 排序.

sort(): 需要传递一个参数来指定排序规则. 1为升序, -1为降序.

如果传多个, 会按照第一个先排序, 再值相同的时候按照后面的排序.

  1. limit, skip.

limit限制返回的结果数.

skip跳过结果的数量.

  1. 常用的操作符.

$regex: 正则表达式, 可用于模糊查询.

db.company.find({name: {$regex: /.*?wen/}})

$exists: 某字段是否存在.

db.company.find({is_deleted: {$exists: false}})

$in: 包含.

db.company.find({age: {$in: [20, 25]}})

$and: 与. 年龄是23岁, 并且名字要是zhangwen. 或者年龄是25岁的.

db.company.find({$and: [{age: 23}, {name: 'zhangwen'}]})

$or: 或.

db.company.find({$or: [{$and: [{age: 23}, {name: 'zhangwen'}]}, {age: 25}]})

$inc: 值增加或者减少.

db.company.update({name: 'zhangwen'}, {$inc: {age: -5}})

  1. aggregate 聚合操作.
db.sales.insertMany([
	{ "_id" : 1, "item" : "铅笔", "price" : 5, "quantity" : 2, tags: ["blank", "red"], size:[10, 2, 3]},
	{ "_id" : 2, "item" : "钢笔", "price" : 20, "quantity" : 2, tags: ["red", "blank"], size:[10, 3, 3]},
	{ "_id" : 3, "item" : "作业本", "price" : 5, "quantity" : 10, tags: ["red", "blank", "plain"], size:[10, 12, 3]},
	{ "_id" : 4, "item" : "铅笔", "price" : 8, "quantity" : 20, tags: ["blank", "red"], size:[10, 2, 4]},
	{ "_id" : 5, "item" : "作业本", "price" : 10, "quantity" : 10, tags: ["blue"], size:[20, 10, 3]}
])
  1. 按照 item 字段进行分组,统计每个 item 下面的文档个数:

  2. 按照 item 字段进行分组,统计每个 item 下面 quantity 的总数,price的平均数

  3. 按照 item 字段进行分组,统计每个 item 下面 price的最大值与最小值.

  1. 数组查询

tags值是只包含两个元素"red","blank"并且有指定顺序.

tags值是只包含两个元素"red","blank"不指定顺序, 只要有这2个即可, 不关心数组中是否有其它元素

tags中有一个元素的值是"red"的所有文档.

size中至少有一个大于10的

size中的第二个必须大于10的

posted @ 2023-06-21 17:11  流星Studio  阅读(23)  评论(0编辑  收藏  举报