简介
什么是MongoDB
MongoDB是一个基于分布式文件存储的NoSQL数据库,基于C++语言开发而成的。它以文档存储格式(BSON)为基础,是由字段和值对组成的数据结构
{
name: "spella",
age: 18,
skill: ["java","vue"]
}
扩展:
BSON(Binary JSON)是一种二进制表示的JSON格式。它与JSON类似,是一种文本的数据交换格式。相比JSON,BSON具有以下优势:
二进制表示的JSON格式,使存储相同数据时,BSON需要的字节数更少,利于大规模数据的存储和传输;
支持更多数据类型;
支持嵌套文档和数组的表示,可更灵活地组织和表示复杂的数据结构。
MongoDB的逻辑结构
数据库(database):一个仓库,里面存放集合。
集合(collection):类似于数组,在集合中可以存放文档。
文档(document):文档数据库中的最小单位,存储和操作的内容都是文档。
Mongo数据类型
基本操作
在MongoDB中,数据库和集合不需要手动创建。当创建文档时,如果文档所在的集合或数据库不存在,数据库会自动创建
基本指令
(1)查看当前所有数据库列表
show dbs/databases
(2) 进入到指定的数据库
use 数据库名
(3)查询当前所处的数据库
db
(4)显示我们数据库中所有的集合
show collections
(5) 清屏
cls
CRUD操作
插入操作
(1)插入一个文档到集合中:db.collection.insertOne({field:value})。
db.collection.insertOne({field:value})
(2)插入多个文档到集合中:db.collection.insertMany([{field:value}])。
db.collection.insertMany([{field:value}])
(3)插入一个或多个文档到集合中:db.collection.insert()。
db.collection.insert()
(4)批量添加两万条数据的性能高,尽量少调用系统的方法。
var arr=[];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.test.insert(arr);
查询操作
(1)查询集合中的数据:db.collection.find() 。
db.collection.find()
(2)限制查询返回结果的数量:limit(Integer id)。
db.users.find().limit(Integer id)
(3)排序查询结果,排序规则1表示升序,-1表示降序:sort({field: [1|-1] })。
db.users.find().sort({age:1})
(4)跳过指定数量的数据:skip(Integer id) 。
db.users.find().sort({age:1}).limit(2).skip(1)
(1)分页功能实现一般使用skip函数和limit函数。skip( (页码-1)*每页显示的条数 ).limit(每页显示的条数)
(2)MongoDB中skip、limit、sort无论怎么组合使用,执行顺序都是sort>skip>limit;
(5)条件查询:find({field: value})。
db.users.find({age:18})
查询满足条件的一条数据:findOne({field: value})
(6)指定查询条件和返回字段:find(field: value}, {field: [0|1]) 。
db.users.find({age:18},{name:1,age:1})
第二个参数用于设置查询结果的投影,属性对应的值1表示返回字段,0表示不返回字段。如果没指定属性_id不返回,则数据库会自动返回_id
(7)比较两个数:$gt大于,$lt小于,$eq等于,$gte大于等于,$lte小于等于。
db.users.find({age:{$gt:20}}) //查询age大于20的数据
db.users.find({age:{$lt:20}}) //查询age小于20的数据
db.users.find({age:{$eq:20}}) //查询age等于20的数据
(8)查询某个字段的值是否在数组中:$in在,$nin不在
db.users.find({age:{$in:[17,18]}})
db.users.find({age:{$nin:[17,18]}})
(9)判断某个字段是否存在:$exists
$exists对应的值0或false表示不存在,1或true表示存在。
db.users.find({age:{$exists:0}})
(10)复杂查询:and、or、not
1)逻辑与:$and: [{field: value}, {field: value}]
db.users.find($and:[{age:{$gte:18},{age:{$lte,20}}])
2)逻辑或:$or: [{field: value}, {field: value}]
db.users.find($or:[{age:{$gte:18},{age:{$lte,20}}])
3)逻辑非:$not: {field: value}
db.users.find($not:[{age:{$gte:18},{age:{$lte,20}}])
(11)正则表达式:$regex: /表达式/
db.users.find({name:{$regex:/张/}})
(12)忽略大小写:$options: “i”
db.users.find({name:{$regex:/Ker/,$options:"i"}})
(13)统计文档数量:db.collection.countDocuments()
db.users.countDocuments({age:{$eq:18}})
(14)统计查询数据的数量:db.collection.find().count()
db.collection.find().count()
(15)查询表中属性去重后的数据:db.collection.distinct(field)
db.collection.distinct("age")
更新操作
(1)更新数据
更新满足条件的一条数据:updateOne({field: value}, {field: value})
更新满足条件的多条数据:updateMany({field: value}, {field: value})
更新满足条件的一条或多条数据:updateMany({field: value}, {field: value})
注意:第一个参数用于找要更新的对象;第二参数表示要更新的文档对象的值。如果更新的字段不存在,则数据库会自动创建这个字段。
(2)用来修改文档中的指定属性:$set: {field: value}
db.users.updateOne({name:"张三"},{$set:{age:19}})
(3)用来删除文档的指定属性:$unset: {field: value}
db.users.update({age:23},{$unset:{sex:"男"}})
(4)用于向数组中添加一个新的元素:$push(可重复添加)
db.users.update({age:23},{$push:{sex:"男"}})
(5)向数组中添加一个新元素:$addToSet(不可重复添加)
db.users.update({age:23},{$addToSet:{"favor":"java"}})
(6)替换一个符合条件的文档对象:db.collection.replaceOne({field:value}, {field:value})
db.users.replaceOne({name:"张三"},{name:"李四",age:20,sex:"男"})
扩展:
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这个文档为内嵌文档。
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过 . 的形式来匹配,且属性名必须使用引号(双引号单引号都行)。比如:db.users.find("hobby.movies":"hero")。
删除操作
(1)删除数据
满足条件的一条数据:deleteOne({field:value})
db.users.deleteOne({name:'李四'})
删除满足条件的多条数据:db.collection.deleteMany({field:value})
db.users.deleteMany({name:'李四'},{age:18})
(2)删除数据库的集合:db.collection.drop()
show collections
db.users.drop()
(3)删除当前所在数据库 :db.dropDatabase()
如果最后一个集合没了,数据库也就没了!