4.MongoDB命令语法基本使用
Shell
Mongo shell是基于JavaScript语法的,MongoDB使用了SpiderMonkey作为其内部的JavaScript解释器引擎,这是由Mozilla官方提供的JavaScript内核解释器,该解释器也被同样用于大名鼎鼎的Firefox浏览器产品之中。SpiderMonkey对ECMA Script标准兼容性非常好,可以支持ECMA Script 6。
数据库操作
#下面一系列操作需先通过如下命令进入shell,
./mongo --port 27017 --shell
#27017端口是默认值,如果没改,可不写,改了必须加上
-
查看
show dbs #查看所有库
-
切换\创建
use my_db #切换数据库,数据库不存在则创建,创建后必须创建表才会通过show dbs 查出
-
删除
db.dropDatabase()#use哪个库,就删哪个
集合(等同MySql中table)操作
#下面一系列操作需先通过如下命令进入shell,
./mongo --port 27017 --shell
#27017端口是默认值,如果没改,可不写,改了必须加上
-
查看(两种方式)
show tables show collections
-
创建
db.createCollection("my_table") #直接通过下方插入文档命令,也可创建集合
-
删除
db.my_table.drop() #my_table是创建的集合名称
-
创建集合参数
db.createCollection(name,options)
options参数
文档(等同于MySql一行数据)操作
新增(一条、多条)
- 通过命令
db.my_table.insertOne({"name":"inserOne"})#插入一条
db.my_table.insert({"name":"insert"}) #插入一条
db.my_table.save({"name":"save"})#插入一条
db.my_table.insertMany([{"name":"inserMany_1"},{"name":"inserMany_2"}])#插入多条
#insertOne&insertMany官方推荐使用,返回值更详细
#my_table是集合名,不存在自动创建
-
通过JS脚本
- 创建批量插入js
var dataArr=[]; for(var i=0;i<100;i++){ var data={ batch_index:i, batch_name:"batch_name_"+i, } dataArr.push(data); } db.batch_table.insertMany(dataArr);
-
进入mongoDb shell,执行
load("/usr/local/mongodb/config/batchInsert.js") #我把刚创建的js文件放到config目录了
查询(查全部、条件查询、分页、模糊查询、指定返回结果列、排序)
-
查询全部
db.batch_table.find() #batch_table为创建的集合名,默认显示20条,通过"it"查看更多
-
查询第一条记录
db.batch_table.findOne() #batch_table为创建的集合名
-
条件查询
db.batch_table.find({batch_index:19}) #将batch_index:19的匹配数据查出 db.batch_table.find({_id: ObjectId("6232a63131a4945b90caea02")}) #根据id查 db.batch_table.find({batch_index:{$gt:17},batch_name:"batch_name_37"}) #根据batch_index>17并且 batch_name=batch_name_37 的记录
附:查询条件字典
-
排序
db.batch_table.find().sort({batch_index:-1}) #根据batch_index排序 # 1 (for ascending) #-1 (for descending)
-
分页
db.batch_table.find().skip(10).limit(5) #从第10条(>=)开始,查询五条记录
-
模糊查询
db.batch_table.find({batch_name:/_1/}) db.batch_table.find({batch_name包含“_1”的:{$regex:"_1"}) #模糊查找batch_name包含“_1”的
-
指定查询出某些列(类似不用select *的意思)
db.batch_table.find({},{batch_index:false,batch_name:false}) db.batch_table.find({},{batch_index:0,batch_name:0}) #指定列如果没有查询条件,必须加空的{} #第二个参数为要查询出的列名 #列名参数必须要么都是true,要么都是false #false:不返回 true:返回 #false=1,true=0
修改
-
根据条件更改
db.batch_table.update({"_id" : ObjectId("6232a63131a4945b90cae9ef")},{ "batch_name" : "update_batch_name_0"}) #上面命令会将匹配到的文档完全更新为新的结构 #部分字段更新、删除具体规则见下方
附:更新命令字典
db.collection.update(query,update,options) #query:描述更新的查询条件; #update:描述更新的动作及新的内容; #options:描述更新的选项 #upsert:可选,如果不存在update的记录,是否插入新的记录。默认false,不插入 #multi:可选,是否按条件查询出的多条记录全部更新。默认false,只更新找到的第一条记录 #writeConcern :可选,决定一个写操作落到多少个节点上才算成功。
-
更新并获得返回值
db.batch_table.findAndModify({query:{"_id" : ObjectId("6232a63131a4945b90cae9ef")},update:{$set:{newfield:1}}}) #将对应数据列新增一列,并返回更新前的文档信息 db.batch_table.findAndModify({query:{"_id" : ObjectId("6232a63131a4945b90cae9ef")},update:{$set:{newfield:1}},new:true}) #加上“new:true”hou ,将对应数据列新增一列,并返回更新后的文档信息 #findOneAndUpdate:更新单个文档并返回更新前(或更新后)的文档。 #findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档。
-
其他
#update命令的选项配置较多,为了简化使用还可以使用一些快捷命令: updateOne:更新单个文档。 updateMany:更新多个文档。 replaceOne:替换单个文档。
更多语法见官方
删除
-
remove
1.批量删除
db.batch_table.remove({"batch_name" : "update_batch_name_1"}) #根据匹配到的数据删除 #db.batch_table.remove({batch_name:“update_batch_name_1”})// batch_name 等于update_batch_name_1的记录 #db.batch_table.remove({}) // 删除所有记录 #db.batch_table.remove() //报错
-
删除一个
db.batch_table.remove({"batch_name" : "update_batch_name_1"},true) #删除满足条件的首条记录
-
-
delete
官方推荐使用 deleteOne() 和 deleteMany() 方法删除文档,语法格式如下:
db.batch_table.deleteMany ({}) //删除集合下全部文档 db.batch_table.deleteMany ({"batch_name" : "update_batch_name_1"}) //删除匹配的全部文档 db.batch_table.deleteOne ({"batch_name" : "update_batch_name_1"}) //删除 匹配到 的一个文档 #都是顺序删除,不可选择头还是尾删除
注意: remove、deleteMany等命令需要对查询范围内的文档逐个删除,如果希望删除整个集合,则使 用drop命令会更加高效
-
删除并获得返回值
findOneAndDelete(可做队列)
db.batch_table.findOneAndDelete((({batch_index:{$lt:5}}))) #删除后会获得删除的文档 db.batch_table.findOneAndDelete({batch_index:{$lt:10}},{sort:{batch_index:-1}}) #根据sort定义,是从头开始删还是从尾开始删,可以做队列了