MongoDB学习笔记
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
无模式, 灵活的文档类型, 无需固定的结构.
命名规则
- 不能是空字符串.
- 不能包含空字符.
- 不能使用system前缀, 因为是系统保留的.
- 建议不包含$.
mongodb对比MySQL
mongo概念 | MySQL概念 | 说明 |
---|---|---|
database | database | 数据库 |
collection | table | 集合 - 表 |
document | row | 数据行 - 文档 |
field | column | 字段 - 属性 |
index | index | 索引 |
嵌入文档 | join | 使用嵌入式的文档来代替关联查询 |
primary key | primary key | mongodb自动生成主键 _id |
基本指令
- show dbs
- show databases
显示当前的所有数据库.
- use 数据库名.
进入到指定的数据库中.
- db
表示当前所处的数据库.
- show collections
显示数据库中所有的集合.
数据库的增删改查.
- 向数据库中插入一个文档
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()插入多个. 语义明确, 易懂.
- 查询文档
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}})
- 更新.
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(): 只更新一个.
- 删除.
db.{collection}.remove() 删除符合条件的所有.
删除一个justOne. 传true. 则只删除一个.
必须传递参数, 不传参会报错, 如果传递一个{}, 则删除所有.
db.{collection}.deleteOne(): 删除一个.
db.{collection}.deleteMany(): 删除多个.
db.{collection}.drop() : 删除集合.
db.{collection}.dropDatabase(): 删除数据库.
一般业务中只做逻辑删除.
- 排序.
sort(): 需要传递一个参数来指定排序规则. 1为升序, -1为降序.
如果传多个, 会按照第一个先排序, 再值相同的时候按照后面的排序.
- limit, skip.
limit限制返回的结果数.
skip跳过结果的数量.
- 常用的操作符.
$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}})
- 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]}
])
按照 item 字段进行分组,统计每个 item 下面的文档个数:
按照 item 字段进行分组,统计每个 item 下面 quantity 的总数,price的平均数
按照 item 字段进行分组,统计每个 item 下面 price的最大值与最小值.
- 数组查询
tags值是只包含两个元素"red","blank"并且有指定顺序.
tags值是只包含两个元素"red","blank"不指定顺序, 只要有这2个即可, 不关心数组中是否有其它元素
tags中有一个元素的值是"red"的所有文档.
size中至少有一个大于10的
size中的第二个必须大于10的