MongoDB Note 【vaynexiao】

概念

关系型数据库不能满足三高需求:高并发 高性能 高可用

应用场景:
	社交
	游戏
	物流
	物联网
	视频直播
	
什么时候需要MongoDB
	对事务要求不高 对关联查询要求不高
	需求随时会变,数据模型不能固定
	访问量巨大
	
数据结构:
	库 集合 文档 字段 索引

数据类型:
Object ID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (一般不用这个,时间戳足够用)

docker方式安装

# docker 方式安装
docker pull mongo
docker run -itd --name mongo -p 27017:27017 -v /docker-mongo/data/db:/data/db mongo # 默认路径是/data/db
docker exec -it f184fa8c9874 /bin/bash
mongo 127.0.0.1:27017 # 进入mongo命令模式
mongo --version
db.version()
use admin
# 创建admin管理用户
db.createUser({
    
     user:'admin',pwd:'123456',roles:[ {
    
     role:'userAdminAnyDatabase', db: 'admin'}]});
# 创建具有读写权限的用户
db.createUser({
    
     user:'user',pwd:'123456',roles:[ {
    
     role:'readWrite', db: 'testdb'}]});
db.auth('user','123456')

基础语法

admin库 # 保存用户和权限
local # 集群时不会复制
config # 保存分片信息

show dbs # 查询所有库(未持久化的查不出来)
use dbname # 创建/使用指定的数据库
db # 查询当前库
db.dropDatabase() # 删除当前库

show collections # 查询所有集合
db.createCollection("collectionName") # 创建指定名字的库
db.collectionName.drop() # 清空集合
db.collectionName.insert({
    
    name:'Larry',age:18}) # insert等价save,没有user集合会自动隐式创建
db.collectionName.insertMany( [ {
    
    name:'faker',age:18}, {
    
    name:'mata',age:18}] ) # 多条要有中括号
db.collectionName.find({
    
    }) # 查询全部文档
db.collectionName.find( {
    
    name:"mata"} )
db.collectionName.find( {
    
    name:"mata"}, {
    
    name:1} ) # 参数1是查询条件 参数2是显示的列
db.collectionName.count()  # 统计总数
db.collectionName.find().count()  # 统计总数
db.collectionName.count(  {
    
    userid:"1003"} )   # 条件统计
# 按照userid排序,1升序,-1降序;userid相同时按照usercode排序
db.collectionName.find().sort(  {
    
    userid:1, usercode:-1} )  
db.collectionName.findOne() # 查询第一个,可带条件
db.collectionName.find().limit(2) # 查出前2条
db.collectionName.find().limit(2).skip(3)  # 查前2条,跳过3条
# 翻页 (页码-1)*pagesize pagesize
# limit skip sort位置前后在语法上没有硬性规定,调换顺序仍然有效,先sort

db.manyuser.find({
    
    email:/88/}) # 模糊查询
$gt大于  $gte大于等于 $lt小于  $lte小于等于 $eq等于 $ne不等于
db.collectionName.find( {
    
    userid:{
    
    $gt:500, $lt:600}} )  # 查询大于500 且 小于600
$or $and
db.collectionName.find( {
    
    $or: [{
    
    userid:{
    
    $gt :500}} , {
    
    userid:{
    
    $lt:600}}]} )  # 查询大于500 or 小于600

db.manyuser.find({
    
    name:{
    
    $in:[500]}}) # $in包含 $nin不包含
db.col.find().pretty() #  .pretty() 美化格式

try{
    
    
	......
} catch (e) {
    
    
	print (e))
}

ObjectId() # 生成id

# 覆盖修改(未修改的其他字段会消失):将id为1的数据的likename字段修改为1001,此处1001被函数转为整数
db.name.update( {
    
    _id:"1"},{
    
     likename:NumberInt(1001) } )  
# 局部修改(只修改指定修改内容的字段):增加 {$set: }
db.name.update(  {
    
    _id:"2"},{
    
     $set: {
    
    likename:NumberInt(1001)} }  )
# 批量更新,符合查询条件的都会修改
db.name.update(  {
    
    _id:"2"},{
    
     $set: {
    
    likename:NumberInt(1001)} }, {
    
    multi:true}  )
# sal低于1000的增加400
db.emp.updateMany( {
    
    sal:{
    
    $lte:1000}}, {
    
    $inc:{
    
    sal:400}} )

# 循环单条插入9999次
for(var i=1; i<10000; i++){
    
    
    db.test.insert({
    
    name:i})
}
# 拼接为一个长bjson,一次插入1w
var arr = [];
for(var i=1; i<=1000000; i++){
    
    
    arr.push( {
    
    name:i, email:i+"@qq.com", age:i, salary:1*100} )
}
db.manyuser.insert(arr)

# db.collectionName.remove() 缺少条件无法执行
db.collectionName.remove(  {
    
    _id:"1"} )
db.collectionName.remove(  {
    
    _id:"1"}, 3 ) #  只删除找到的前3条
db.collectionName.remove({
    
    })   # 全部删除


########################  ?????  ############################
# 内嵌查找 属性名必须加双引号\单引号,不然报错
db.collectionName.find({
    
    "hobby.movies":"hero"})
$push  # 内嵌修改,向数组添加某一个值,即使已存在也会成功
$addToSet # 等同于$push 但该元素已存在会失败,类似javaset集合,不可重复

# 关联查询 find返回的是数组要么findOne 要么index
var u_name = db.test.findOne( {
    
    _id:ObjectId("5edb879f5bb71661181523dd")} ).name;
db.test.find({
    
    name:u_name})

# $unset 删除
# $inc
db.test.replaceOne({
    
    age:100},{
    
    name:1002}) # 也会修改数据,也会只剩下name属性

# cmd中执行 注意json内容的key要带双引号,不然导入失败
# --drop可选参数,导入前是否要清空
mongoimport --db test --collection test [--drop]--file C:\Users\vaynexiao\Desktop\1.json

索引

https://www.bilibili.com/video/BV1bJ411x7mq?p=15
之后的都没看
搭配菜鸟教程
https://www.runoob.com/mongodb/mongodb-regular-expression.html

猜你喜欢

转载自blog.csdn.net/vayne_xiao/article/details/106562015