Mongo入门-2-基本操作
创建数据库
use + 数据库名称
use会创建一个数据库,如果这个数据库存在,那么返回这个数据库
示例
创建一个数据库skdb
use skdb
使用db命令查看当前选定的数据库
db
使用show dbs命令来检查数据库列表
show dbs
插入新的文档到集合中
db.student.insert{
stuid : 1,
stuname : "xxx"
}
删除数据库
db.dropDatabase
范例
sue sdkb
db.dropDatabase()
插入文档
若不存在,插入新文档时会自动创建一个新的集合,再插入.
db.collection.insertOne():向指定的集合插入一条数据
db.collection.insertMany():向指定的集合中插入多条数据
db.users.insertOne(
{name:"sue",age:22,status:"xxx"
}
)
向users插入多条文档
db.users.insertMany(
[{
name:"zzxb",
age:18,
status:"xxx"
},
{
name:"ilyj",
age:38,
status:"stop"
}
]
)
更新文档
db.collection.update(
<query>,
<update>,
{upsert:<boolean>,multi:<boolean>,writeConcern:<documnet>
}
)
参数说明:
- query:update的查询条件,类似sql update查询内where后面的
- update:update的对象和一些更新的操作符号
- upsert:可选 若不存在update的记录,是否插入objNew,true为插入,默认为false,不插入
- multi:可选,只更新找到的第一条记录,true:把按条件查出来的多条记录全部更新
- writeConcern:可选 抛出异常的级别
3.2版本开始 MongoDB提供以下更新集合文档的方法
db.collention.updateOne()
db.collection.updateMany()
范例
将name为zzxb的文档,更新年龄为40
db.user.update(
{"name":"zzxb"},
{$set:{"age":40}}
)
将年龄小于30的文档,更新状态为stop
db.users.update(
{"age":{$lt:30},
{$set:{"status":"stop"}}
}
)
大于小于
- lt : 小于
- gt: 大于
- lte : 小于等于
- gte : 大于等于
- ne: 不等于
save语法
save()方法通过传入的文档来替换已有的文档
db.collection.save(
<document>,
{
writeConcern:<document>
}
)
- document:文档数据
- writeConcern:可选的,抛出异常的级别
替换id为5a67ea03fd6b999d262bae2c的文文档内容
db.users.save({_id:ObjectId("5a67..."),name:"myzzxb",age:28,status:"starting"
})
修改器
通常文档只会有一部分要更细,使用原子性的更新,指定文档的某些字段进行更新
更新修改器是钟特殊的键.用来指定复杂的更新操作:修改,增加 删除,还可能是操作数据或内嵌文档
$inc:修改器⽤用来增加已有键的值,或者该键不存在那就创建⼀一个
新建集合
db.fangwencount.insert([{url:"www.163.com",pageviews:52},{url:"www.sina.com.cn",pageviews:52
} ]
)
使用$inc修改访问次数
db.fangwencount.update({url:"www.sina.com.cn"},{$inc:{pageviews:2}})
$inc键的值必须为数
$set指定一个字段的值 如果不存在那么创建
db.students.insert({
name:"zzxb", age:19, sex:"男"
} )
添加学生爱好
db.sutdent.update(
{name:''zzxb''
},{$set:{aihao:"football"}
}
)
再添加一个爱好
db.student.update(
{name:"zzxb"
},
{$set:{aihao:"football","basletball"}
}
)
$unset可以删除字段
删除aihao的键值
bd.sutdent.update(
{name:"zzxb"
},
{$unset:{aihao:null}
}
)
数组修改器
数组是很有用的数据结构
可通过索引进行引用的列表
还可以作为数据集采用
添加元素
若数组存在
$push会向数组末尾添加一个元素
没有数组就创建一个新的数组
新增集合
db.blog.posts.insert({title:"mongdb操作⼿手册",content:"这是⼀一份mongdb操作⼿手册",addtime:new Date()}
)
$push添加元素
db.blog.post.updateOne(
{title:"mongodb操作手册"
},
{$push:{comment:{name:"ifeng",email:"xxx@163.com",addtime:new Date()}}
}
)
再次添加评论
db.blog.posts.updateOne(
{title:"mongo操作手册"
},
{$push:{comment:{name:"asdfj",email:"asdfa@163.com",addtime:new Date()}}
}
)
$each,可以通过一次 $push操作添加多个值
添加一个新的likes字段,用于记录点赞的人
db.blog.posts.updateOne(
{title:"mongodb操作手册"
},
{$push:{$each:[{name:"aa"},{name:"bb"},{name:"cc"}]}
}
)
$addToSet向数组添加不重复的元素
向like字段添加重复的元素
db.blog.posts.update(
{title:"mongo操作手册"
},{$addToSet:{likes:{name:"cc"}}
}
)
$pop $pull $pullAll
$pop指定数组删除的值 1:最后一个 -1:第一个
{$pop:{name:1}}
$pull删除被指定的值
{$pull:{name:"cc"}}
$pullAll:一次性删除多个指定的值
{$pullAll:{name:["js","JAVA"}}
使用占位符$操作嵌套文档
db.blogs.posts.update(
{_id:ObjectId("aksjdf;lka","comment.uname":"zzxb")},
{$set:{"comment.$.cotent":"ok"}}
)
注意:目前mongo不支持多个$
updataMany()
更新文档
findAndModify()能够在⼀个操作中返回匹配结果并且进⾏更新。
删除文档
语法1
db.collection.deleteOne(<filter>,{writeConcern: <document>,collation: <document>}
)语法2
db.collection.deleteMany(<filter>,{writeConcern: <document>,collation: <document>}
)参数说明:
filter : 条件
writeConcern :可选,抛出异常的级别。
collation:可选,排序⽅式⾃定义
删除ifeng用户
db.users.deleteOne(
{name:"ifeng"}
)
查询⽂档
插入模拟的数据
查询语法
db.collection.find(query,projection)参数说明:
query :可选,使⽤查询操作符指定查询条件
projection :可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值, 只需省略该
参数即可(默认省略)。
查询所有文档 并且显示所有字段
db.users.find()
查询全部文档 并且显示name字段
db.users.find({},{name:1})_id键默认返回 需要指定——id:0才会隐藏
db.userts.fidn({},{_id:0,name:1})
条件操作符
条件操作符⽤于⽐较两个表达式并从mongoDB集合中获取数据。
通过下表可以更好的理解 MongoDB 的条件操作符语句:
查询年龄等于30的用户
db.users.find(
{age:30}
)
查询年龄大于28的用户
db.users.find(
{age:{$ge:28}}
)
查询年龄大于等于30岁的用户
db.users.find(
{age:{$gte:30}}
)
And条件
语法:
db.collection.find({key1:value1,key2:valuse2})
查询年龄大于30 状态位ok的用户
db.users.find(
{age:{$gt:30},status:"ok"
}
)
OR条件
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
查询年龄大于30 或者状态时stop的用户
db.users.fidn(
{$or:[{age:{$gte:30}},{status:"stop"}]
}
)
查询出指定键
db.[集合名].find({条件},{键指定})
db.students.find({},{_id:0,stuname:1,city:1})
查询出年龄在25到27岁之间的学生
db.student.find({age:{$get25,$lte:27}})
包含 不包含($ in/$sin)
查询出所有(bu)是济南或者烟台的学生信息
db.mystu.find(
{city:{$(n)in:["jinan","yantia"]}
}
)
OR查询
查询所有高考成绩大约79或者Hadoop成绩大于80的学生信息
db.mystu.find(
$or:{{java:{$gt:79}},{hadoop:{$gt:80}}
}
)
把所有济南学生信息添加sex字段 并设置位man
db.mystu.updateMany(
{city:"jinan"},
{$set:{sex:"man"}}
)
模糊查询 正则表达式
//查询出名字中含有zz的信息
db.mystu.find(
{stuname:/zz/}
)db.mystu.find(
{stuname:{$regex:"zz"}}
)//不区分大小写
db.mystu.find(
{stuname:/zz/i}
)db.mystu.find(
{stuname:{$regex:"zz",$options:"$i"}}
)
$regex与正则表达式对象的区别:
在KaTeX parse error: Expected '}', got 'EOF' at end of input: …达式对象,例如:{name:{in:[joei,jack}}
在使⽤隐式的and操作符中,只能使⽤and操作符中,只能使⽤and操作符中,只能使⽤regex,例如:{name:{$regex:^joi, KaTeX parse error: Expected 'EOF', got '}' at position 13: nin:['john']}̲} 当option选项中包含X…regex,例如:{name:{$regex:m.line,
$options:“si”}}
not使⽤
查询出所有名字不含有“zz”的学⽣信息
db.mystu.find(
{stuname:{$not:/zz/}}
)
注意$ not不能与$ regex同时使⽤
数组查询$ all和$ index应⽤
查询出拥有MONGODB和html书籍的学⽣
db.mystu.find(
{books:{$all:["html","MONGODB"]}}
)
查询出拥有第⼆本书是java书籍的学⽣
db.mystu.find(
{"books.1":"java"}
)
数组⻓度 $ size
查询出拥有四本书籍的所有学⽣信息
db.mystu.find(
{books:{$size:4}}
)
查询出拥有⼤于三本书籍的所有学⽣信息
db.mystu.find(
{books:{$size:{$gt:3}}}
)
⽆法实现, $ size⽆法与$ gt, $lt等⽐较符同时使⽤
1.新增⼀个书籍数量的字段
db.mystu.updateMany({},{$set:{num:4}})
2.给zzxb学⽣,新增⼀本regex书籍
db.mystu.update(
{stuname:"zzxb"},
{$push:{books:"regex"},
$inc:{num:1}}
)
3.查询⼤于4本书的学⽣
db.mystu.find({num:{$gt:4}})
$slice
查询出zzxb学⽣,拥有的第2到第4本书
db.mystu.find(
{stuname:"zzxb"}, { books: { $slice: [ 1, 4 ] } }
)
查询出zzxb学⽣,拥有的最后⼀本书
db.mystu.find(
{stuname:"zzxb"}, { books: { $slice: -1 } }
)
⽂档查询
为zzxb,添加新的学习简历集合
var zzxb = [
{school:"善林路⼩学",score:"A"},
{school:"140初中",score:"B"},
{school:"109⾼中",score:"A+"}
]
插⼊
db.students.update({stuname:"zzxb"},
{$set:{school:[
{school:"善林路⼩学",score:"A"},
{school:"140初中",score:"B"},
{school:"109⾼中",score:"A+"}]
}});
查询在109中学,上过学的学⽣
匹配查询:
db.students.find({school:{school:"109⾼中"}});
⽆法查询出结果,必须要完全匹配
db.students.find({school:{school:"109⾼中",score:"A+"}});
点“.”定位器:
db.students.find({"school.school":"109⾼中"})
查询出在140初中且成绩为A的学⽣
db.students.find(
{"school.school":"140初中","school.score":"A"})
查询错误,查出不符合要求的记录
使⽤用$elemMatch查询⼦子⽂文档
db.students.find({school:{$elemMatch:{school:"140初中",score:"A"}}});
db.students.find({school:{$elemMatch:{school:"140初中"}}});
where复杂查询
JS字符串串⽅方式:
db.students.find({$where:"this.age > 25"});
Js函数⽅方式
db.students.find({$where:function() {if (this.age > 25 && this.age < 30){return this;
} }
});
复杂:
db.students.find({$where:function (){if(this.city == 'jinan'){for(var i = 0;i < this.books.length;i++){var java = this.books[i];if(java == 'oracle'){return this;
} }
} }});
分⻚页与排序
limit、skip
查询出前五条记录
db.students.find({},{stuname:1}).limit(5);
查出5-10条记录 db.students.find({},
{stuname:1}).limit(5).skip(5);
sort排序 倒序:
db.students.find({},{stuname:1,age:1}).limit(5).skip(5).sort({age:-1});
正序:
db.students.find({},{stuname:1,age:1}).limit(5).skip(5).sort({age:1});
游标
使用游标
var stu = db.student.find();
while(stu.hasNext()){var. obj = stu.next();print(obj.stuname);
}
游标销毁条件
- 客户端主动销毁
- 游标到底
- ⼗十分钟内游标没使⽤用,⾃自动销毁
索引
创建索引
db.books.ensureIndex({number:1});
索引使⽤用需要注意的地⽅方
- 创建索引:1是正序索引,-1是倒序索引
- 索引的创建在提⾼高查询性能的同时会影响插⼊入的性能。对于经常查询少插⼊入的集合可以考虑⽤用
索引。 - 符合索引要注意索引的先后顺序
- 每个键全建⽴立索引不不⼀一定就能提⾼高性能。
创建索引同时指定索引名字
db.books.ensureIndex({number:-1},{name:"ix_number"});
唯⼀一索引
db.books.ensureIndex({bookname:1},{unique:true});
Hint
如何强制查询使⽤用指定的索引
db.books.find({bookname:"bookname1"}).hint({bookname:1});
explain
查看本次查询使⽤用索引情况和查询数据的状况信息
db.books.find({bookname:"book1"}).explain(); db.books.find({bookname:"book23456"}).explain("executionStats");//version 3.0以 上
查看所有索引
db.system.indexses.find(); db.books.getIndexes();//version 3.0以上
后台执⾏行行创建索引
db.books.ensureIndex({bookname:1},{background:true});
删除索引
db.runCommand({dropindexes:"books",index:"ix_number"});
空间索引
创建2D索引
db.maps.ensureIndex({gis:"2d"},{min:-1,max:201});默认会创建⼀一个【-180,180】之间的2D索引
案例例1
查询点(70,180)最近的三个点
db.maps.find({gis:{$near:[70,180]}}).limit(3);
案例例2
查询以点 (50,50)和点(190,190)为对⻆角线的正⽅方形中的所有点
db.maps.find({gis:{$within:{$box:[[50,50],[190,190]]}}});
案例例3 查询以点(50,50)为圆⼼心,半径为100规则下的圆下的所有点
db.maps.find({gis:{$within:{$center:[[50,50],150]}}});
备份与恢复
备份:
mongodump -h localhost -d skmongo -o /mydata
恢复:
mongorestore -h localhost:27017 -d skmongo /yundata/backup/mongo/skmongo
Mongo入门-2-基本操作相关推荐
- MONGO入门(Mongo,maven)
mongo入门 一.MongoDB相关概念 1.1 业务应用场景 二.mongo的基本操作 2.1数据库的创建 2.2 查看当前数据库 2.3数据库的增删改查 2.3.1mongo的删除数据库的操作: ...
- python使用教程pandas-Python 数据处理库 pandas 入门教程基本操作
pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有表现力的数据结 ...
- 逆向爬虫14 Mongo入门
逆向爬虫14 Mongo入门 一.MongoDB和MySQL的区别 MongoDB 是一种 非关系型数据库,存放任意形式的 json 格式数据:而 MySQL 是一种 关系型数据库,只能存放事先定义好 ...
- 立创EDA仿真入门1 基本操作
立创EDA仿真入门1 基本操作 一.进入EDA仿真环境 二.画原理图 1. 新建工程 2. 绘制如下电路图 三.仿真 1. 运行仿真 2. 导出波形图 3. 查看仪表 一.进入EDA仿真环境 网址: ...
- OpenCV基础入门系列基本操作——贰
系列博文第二篇,关于OpenCV4的一些基本操作和使用. 博文主要以实例展示不同的函数使用方法. OpenCV基础入门系列基本操作--壹 前言 下述为本博文需要用到的各类头文件以及全局变量等 读者可根 ...
- mysql入门教程——基本操作
MySQL入门教程--基本操作 一.MySQL基础 1.数据库介绍 2.mysql安装和配置 3.超管密码修改 二.数据库的操作 1.SQL语句 2.数据库操作 2.1.查询数据库 2.2.创建数据库 ...
- ROS入门的基本操作
ROS入门的基本操作 一.ROS命令行工具的使用 二.创建工作空间与功能包 创建工作空间的流程 创建功能包的流程 三.发布者Publisher的编程实现 如何实现一个发布者 如何配置CMakeLIst ...
- R语言怎么写积分_R语言入门的基本操作(1)
大家好,这是从知乎<一个大学生的日常笔记>中迁移过来的R语言教程的第一篇. 这一份笔记follow了两本非常优秀的R语言教材,分别是Robert I.Kabacoff的<R语言实战& ...
- Mongo学习---mongo入门1
Docker安装以及设置mongo用户 docker pull mongo (拉取镜像 默认最新版本) docker images (查看镜像) docker run -p 27017:27017 - ...
- HDFS 入门和基本操作
1.HDFS 是做什么的 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS,hdfs是分布式计算中数据存储管理的基础,是基于流数据模式 ...
最新文章
- cocos2d-x-3.1 win32程序-初识源代码(coco2d-x 学习笔记二)
- poj 3281(最大流)
- Linux各发行版本之间的比较
- laravel+php+支付功能,laravel+微信支付源码
- 《算法竞赛进阶指南》0.5排序
- middlegenidenbsp;nbsp;eclipsenbsp;的插件
- statistic在c语言中的作用,模型评价除了C-statistic,还能用什么指标?
- 用Lightroom Classic CC2019 mac合并照片以创建全景和HDR全景
- 川土微电子 | CA-IS3050U隔离式CAN收发器
- 在Dart中使用FFI调用Rust函数
- Adobe Spark试用手记
- 如何使用	Pixelmator Pro调整照片,打印出最完美的照片效果?
- 移动硬盘插到电脑上突然打不开或者没有显示的解决方法【已解决】不删设备不删驱动不改电源选项
- 榜首易主!在线票务大战胜负已定,透过中影这个小动作早已看穿一切
- 洛谷P1417:优先级与背包问题
- icode 三级训练场if入门1-10关
- 候鸟浏览器、变色龙指纹浏览器、antidetect防关联浏览器、ghostbrowser横评
- 计算机考研之中南大学PK东南大学
- 计算机组装与维护过程及内容,计算机组装与维护
- 【解决方案】RTSP协议视频平台EasyNVR建立智能水库管理系统,打造智慧水库
热门文章
- kafka 0.10.0.0 版本
- 英雄联盟7月23日维修服务器,LOL7月23日更新维护结束时间 7月23日什么时候可以上线 LOL7月23日更新维护内容_蚕豆网新闻...
- 2017华为软件精英挑战赛决赛思路分享
- python语言基本认识_Python学习之认知(一)
- 基于改进的蚂蚁群算法求解最短路径问题、二次分配问题、背包问题【MatlabPython代码实现】
- Java中outer标签的用法
- 引导魔女之力,征服星辰大海 升级篇: 重要事情说三遍: 升级!升级!!升满级!!! 简述: 1.本篇仅升级,涉及到的技巧全职业都可以参考; 2.考虑到萌新刚玩通关护卫者系统等级不高,故
- java采用降低图片分辨率大小来压缩图片大小
- 第17章 国际贸易与资本流动
- linux nc命令 测试网络连通性