Mongodb学习(3)基本操作——增删改查
环境 Linux环境
Mongodb3.4.4
首先按照之前的方法启动 MongoDB
./mongod -dbpath /data/db
创建数据库
语法
MongoDB 创建数据库的语法格式如下所示:
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
比如:
> use mytestdb
switched to db mytestdb
> db
mytestdb
> show dbs
admin 0.000GB
local 0.000GB
test 0.000GB
然后是不是就很奇怪, 刚刚创建了 “mytestdb” 怎么没找到?
那是因为里面没有任何数据,虽然创建成功了,但是暂时并不会显示
需要按照下面的方式,插入一条数据之后才能显示
> db.person.insert({"name":"Jimy"})
WriteResult({ "nInserted" : 1 })
> show dbs
test 0.000GB
admin 0.000GB
local 0.000GB
mytestdb 0.000GB
插入语句使用的时候,注意大括号和小括号,不要遗漏了
PS:MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
插入文档数据
文档的数据结构和JSON基本一样。
所有存储在集合中的数据都是BSON格式。
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
db是数据库句柄
COLLECTION_NAME是要类似sheet页名字,即集合名document就是插入的数据
实例如下:
> db.person.insert({"name":"Jimy","age":18,"hobby":"play balls"})
WriteResult({ "nInserted" : 1 })
以上实例中 person 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
按照下面的命令可以查看插入的数据:
> db.person.find()
{ "_id" : ObjectId("5912d3639bb9d1ee6fc1ce8f"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d48a9bb9d1ee6fc1ce90"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"), "name" : "Jimy", "age" : 18, "hobby" : "play balls" }
这种find()语法可以查看当前所有已经插入的数据
同时,可以定义变量,然后使用变量插入
> data_insert={"name":"alice","age":19,"hobby":"listen music"}
定义之后会回显一下:
{ "name" : "alice", "age" : 19, "hobby" : "listen music" }
将其插入,并查看
> db.person.insert(data_insert)
WriteResult({ "nInserted" : 1 })
> db.person.find()
{ "_id" : ObjectId("5912d3639bb9d1ee6fc1ce8f"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d48a9bb9d1ee6fc1ce90"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"), "name" : "Jimy", "age" : 18, "hobby" : "play balls" }
{ "_id" : ObjectId("5912d5e49bb9d1ee6fc1ce92"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
插入文档你也可以使用 db.col.save(document) 命令。
如果不指定 _id 字段 save() 方法类似于 insert() 方法。
如果指定 _id 字段,则会更新该 _id 的数据。
更新文档数据
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
> db.person.insert({"name":"Bob","age":22,"sex":"male"})
WriteResult({ "nInserted" : 1 })
通过 update() 方法来更新名字(name)
> db.person.update({"name":"Bob"},{$set:{"name":"Jack_chen"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find()
{ "_id" : ObjectId("5912d3639bb9d1ee6fc1ce8f"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d48a9bb9d1ee6fc1ce90"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"), "name" : "Jimy", "age" : 18, "hobby" : "play balls" }
{ "_id" : ObjectId("5912d5e49bb9d1ee6fc1ce92"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e0f69bb9d1ee6fc1ce93"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e17a9bb9d1ee6fc1ce94"), "name" : "Jack_chen", "age" : 22, "sex" : "male" }
使用update()方法,注意大括号的个数
save() 方法
通过传入的文档来替换已有文档。语法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
> db.person.save({ "_id" : ObjectId("5912e17a9bb9d1ee6fc1ce94"), "name" : "Jack_chen", "age" : 28, "sex" : "male" })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find()
{ "_id" : ObjectId("5912d3639bb9d1ee6fc1ce8f"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d48a9bb9d1ee6fc1ce90"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"), "name" : "Jimy", "age" : 18, "hobby" : "play balls" }
{ "_id" : ObjectId("5912d5e49bb9d1ee6fc1ce92"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e0f69bb9d1ee6fc1ce93"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e17a9bb9d1ee6fc1ce94"), "name" : "Jack_chen", "age" : 28, "sex" : "male" }
只更新第一条记录:
db.person.update( { "age" : { $gt : 20 } } , { $set : { "status" : "married"} } );
全部更新:
db.person.update( { "age" : { $gt : 20 } } , { $set : { "status" : "married"} },false,true );
只添加第一条:
db.person.update( { "age" : { $gt : 21 } } , { $set : { "status" : "married"} },true,false );
全部添加加进去:
db.person.update( { "age" : { $gt : 19 } } , { $set : { "status" : "married"} },true,true );
全部更新:
db.person.update( { "age" : { $gt : 15 } } , { $inc : { "status" : married} },false,true );
只更新第一条记录:
db.person.update( { "age" : { $gt : 10 } } , { $inc : { "status" : married} },false,false );
查询文档数据
db.collection.find(query, projection)
- uery :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
db.collection.find().pretty()
如下所示:
> db.person.find().pretty()
{ "_id" : ObjectId("5912d3639bb9d1ee6fc1ce8f"), "name" : "Jimy" }
{ "_id" : ObjectId("5912d48a9bb9d1ee6fc1ce90"), "name" : "Jimy" }
{
"_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"),
"name" : "Jimy",
"age" : 18,
"hobby" : "play balls"
}
{
"_id" : ObjectId("5912d5e49bb9d1ee6fc1ce92"),
"name" : "alice",
"age" : 19,
"hobby" : "listen music"
}
{
"_id" : ObjectId("5912e0f69bb9d1ee6fc1ce93"),
"name" : "alice",
"age" : 19,
"hobby" : "listen music"
}
{
"_id" : ObjectId("5912e17a9bb9d1ee6fc1ce94"),
"name" : "Jack_chen",
"age" : 28,
"sex" : "male"
}
> db.person.find({"name":"alice"})
{ "_id" : ObjectId("5912d5e49bb9d1ee6fc1ce92"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e0f69bb9d1ee6fc1ce93"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
通过组合选项查找:
> db.person.find({ $or:[ {"age":18}, {"sex":"male"}] })
{ "_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"), "name" : "Jimy", "age" : 18, "hobby" : "play balls" }
{ "_id" : ObjectId("5912e17a9bb9d1ee6fc1ce94"), "name" : "Jack_chen", "age" : 28, "sex" : "male" }
使用AND 和 OR 查找
>db.person.find({"age":{$gte:18} , $or: [{"name": "Jimy"},{"hobby":"play balls"}] })
{ "_id" : ObjectId("5912d4be9bb9d1ee6fc1ce91"), "name" : "Jimy", "age" : 18, "hobby" : "play balls" }
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
使用 show tables 查看当前有几个表
> db.school.insert({"name":"No1 middle"})
WriteResult({ "nInserted" : 1 })
> show tables
person
school
查看数据库
使用 db 命令查看当前工作的 数据库
使用shows dbs 查看所有数据库的名字
> db
mytestdb
> show dbs
admin 0.000GB
local 0.000GB
mytestdb 0.000GB
test 0.000GB
删除文档数据
MongoDB remove()函数是用来移除集合中的数据。
MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
基本语法如下:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
> db.person.remove({"name":"Jimy"})
WriteResult({ "nRemoved" : 3 })
因为 justOne 参数默认为false ,因此有几条,就删除几条
如果只想删除找到的第一条, 需要将justOne 设置为 1 或者true
> db.person.find()
{ "_id" : ObjectId("5912d5e49bb9d1ee6fc1ce92"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e0f69bb9d1ee6fc1ce93"), "name" : "alice", "age" : 19, "hobby" : "listen music" }
{ "_id" : ObjectId("5912e17a9bb9d1ee6fc1ce94"), "name" : "Jack_chen", "age" : 28, "sex" : "male" }
> db.person.remove({"name":"alice"},1)
WriteResult({ "nRemoved" : 1 })
> db.person.remove({})
WriteResult({ "nRemoved" : 2 })
> db.person.find()
删除数据库
MongoDB 删除数据库的语法格式如下:
db.dropDatabase()
先创建一个再删除,如下:
> use ruboob
switched to db ruboob
> db.dropDatabase()
{ "dropped" : "ruboob", "ok" : 1 }
使用drop命令删除集合,即删除tables
删除集合的方式如下:
> use mytestdb
switched to db mytestdb
> db
mytestdb
> show tables
person
school
> db.person.drop()
true
> show tables
school