# 操作数据库
# 创建数据库
一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为 "db",该数据库存储在 data 目录中。
MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME | |
> use shsxt | |
switched to db shsxt | |
> db shsxt |
注:如果数据库不存在,则创建数据库,否则切换到指定数据库。
# 查询数据库
执行 "db" 命令可以显示当前数据库对象或集合,若想想查看所有数据库,可以使用 show dbs 命令:
> show dbs | |
admin 0.000GB | |
config 0.000GB | |
local 0.000GB |
如上图,我们可以看到刚创建的 shsxt 数据库并不在数据库列表中,若想显示它,我们需要向 shsxt 数据库插入文档。
> db.table1.insert({"name":"上海尚学堂"}) | |
WriteResult({ "nInserted" : 1 }) | |
> show dbs | |
admin 0.000GB | |
config 0.000GB | |
local 0.000GB | |
table1 0.000GB |
table1 是数据库表集合
# 删除数据库
MongoDB 删除数据库的语法格式如下:
默认删除当前数据库,你可以使用 db 命令查看当前数据库名。
db.dropDatabase() | |
> db shsxt | |
> db.dropDatabase() | |
{ "dropped" : "shsxt", "ok" : 1 } | |
> show dbs | |
admin 0.000GB | |
config 0.000GB | |
local 0.000GB |
# 操作集合
# 创建集合
db.createCollection(name, {capped: <Boolean>, autoIndexId: <Boolean>, size: <number>, max <number>}) |
- name 是要创建的集合的名称,options 是一个文件,用于指定配置的集合。
- name: 是要创建的集合的名称
- capped: 是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义
- size: 限制集合使用空间的大小,默认为没有限制
- max: 集合中最大条数限制,默认为没有限制
- autoIndexId: 是否使用_id 作为索引,默认为使用 (true 或 false) size 的优先级比 max 要高
> db.createCollection("shsxt") | |
{ "ok" : 1 } | |
> show collections shsxt |
注:在 MongoDB 中不需要创建集合,在创建文档时会自动创建集合
# 方式一: | |
db.table1.insert({"a":1}) # 当第一个文档插入时,集合就会被创建并包含该文档 | |
# 方式二: | |
db.table2 # 创建一个空集合 | |
# 空集合不会在 Robo 3t 上显示出来 |
# 删除集合
MongoDB 删除集合的语法格式如下:
db.COLLECTION_NAME.drop() | |
> db.shsxt.drop() | |
true | |
> show collections # 显示所有集合 | |
> |
# 操作文档
# 插入文档
# insert()
user0 = { | |
"name":"zhangsan", | |
"age":18, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"BJ" | |
} | |
} | |
db.user.insert(user0) |
注:_id 字段,这个值必须在 user 集合中唯一,若不指定主键值,会自动分配一个值。
# save()
插入文档你可以使用 db.test.save(document)
命令。如果不指定 _id
字段 save ()
方法类似于 insert () 方法。如果指定 _id 字段,则会更新该 _id 的数据。
user1 = { | |
"_id":"2", | |
"name":"lisi", "age":20, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"BJ" | |
} | |
} | |
db.user.save(user1) |
# 批量插入
user1 = { | |
"_id":1, "name":"zhangsan", "age":1, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"BJ" | |
} | |
} | |
user2 = { | |
"_id":2, "name":"lisi", "age":2, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"SH" | |
} | |
} | |
user3 = { | |
"_id":3, "name":"wangwu", "age":3, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"GZ" | |
} | |
} | |
user4 = { | |
"_id":4, "name":"zhaoliu", "age":4, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"SZ" | |
} | |
} | |
user5 = { | |
"_id":5, "name":"tianqi", "age":5, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"TY" | |
} | |
} | |
db.user2.insertMany([user1, user2, user3, user4, user5]) |
# 更新文档
MongoDB 使用 update () 和 save () 方法来更新集合中的文档,我们详细来看下 update 的应用,上一节已经介绍过 save () 方法。
update () 方法用于更新已存在的文档。语法格式如下:
db.user.update(<query>, <update>) |
参数说明:
- query : update 的查询条件,类似 sql update 查询内 where 后面的。
- update : update 的对象和一些更新的操作符(如inc...)等,也可以理解为 sql update 查询内 set 后面的
user2 = { | |
"name":"wangwu", "age":20, | |
"hobbies":["music", "read"], "addr":{ | |
"country":"China", | |
"city":"BJ" | |
} | |
} | |
# 查找到的匹配数据如果是多条,只会修改第一条。 | |
db.user.update({"name":"lisi"}, user2) # 修改单条等价于 updateOne () | |
# 查找到的匹配数据如果是多条,修改所有匹配到的记录。 | |
db.user.updateMany({"name":"lisi"}, user2) # 修改多条 |
注:比如修改的值只有 name,age 其余属性会被删除
$inc
# 增加和减少 $inc # 年 龄 都 -1 db.user.update ( | |
{}, | |
{"$inc":{"age":-1}}, | |
{"multi":true} | |
) | |
# 年 龄 都 +10 db.user.update ( | |
{}, | |
{"$inc":{"age":10}}, | |
{"multi":true} | |
) |
# 删除文档
MongoDB remove () 函数是用来移除集合中的数据,其语法格式如下所示:
db.user.remove(<query>, {justOne: <boolean>}) |
参数说明:
- query:(可选)删除的文档的条件。
- justOne :(可选)如果设为 true,则只删除一个文档,False 删除所有匹配的数据等价于
db.user.deleteOne (<query>):删除符合条件的第一个文档
db.user.remove({"name":"lisi"}, {justOne: true}) | |
db.user.deleteOne({"name":"lisi"}) |
删除所有数据命令:
db.user.remove({}) | |
# 等价于 | |
db.user.deleteMany({}) # 等于是清空该集合(表) |
# 有嵌入文档,且内容含有 "country":"China" 的全都删除 | |
db.user.deleteMany( {"addr.country":"China"} ) | |
# 删除 id 大于等于 3 的所有 | |
db.user.deleteMany({"_id":{"$gte":3}}) | |
# 删除所有 | |
db.user.remove({}) | |
db.user.deleteMany({}) |
# 查询文档
# 查询所有
MongoDB 查询数据的语法格式如下:
db.user.find() # 等同于 db.user.find ({}) # 去 重 | |
db.user.distinct('name') |
find () 方法以非结构化的方式来显示所有文档。
如果你需要以易读的方式来读取数据,可以使用 pretty () 方法,语法格式如下:
db.user.find().pretty() |
pretty () 方法以格式化的方式来显示所有文档
# 比较运算
=,!= ('gt') ,< ('gte') ,<= ('$lte')
#1、select * from user where id = 3 | |
db.user.find({"_id":3}) | |
#2、select * from user where id != 3 | |
db.user.find({"_id":{"$ne":3}}) | |
#3、select * from user where id > 3 | |
db.user.find({"_id":{"$gt":3}}) | |
#4、select * from user where age < 3 | |
db.user.find({"age":{"$lt":3}}) | |
#5、select * from user where id >= 3 | |
db.user.find({"_id":{"$gte":3}}) | |
#6、select * from user where id <= 3 | |
db.user2.find({"_id":{"$lte":3}}) |
# 逻辑运算
MongoDB 中字典内用逗号分隔多个条件是 and 关系,或者直接用or,$not(与或非)
#逻辑运算:$and,$or,$not | |
#1 select * from user where id >=3 and id <=4; | |
db.user.find({"_id":{"$gte":3,"$lte":4}}) | |
#2 select * from user where id >=3 and id <=4 and age >=4; | |
db.user.find({ | |
"_id":{"$gte":3,"$lte":4}, "age":{"$gte":4} | |
}) | |
db.user.find({ "$and": [{"_id": {"$gte":3, "$lte":4}},{"age": {"$gte":4}}]}) | |
#3 select * from user where id >=0 and id <=1 or id >=4 or name = "tianqi"; | |
db.user.find({$or: [{"_id": {$gte:0, $lte:1}},{"_id": {$lte:4}},{"name": "tianqi"}]}) | |
#4 select * from user where id % 2 = 1; | |
db.user.find({"_id":{"$mod":[2,1]}}) | |
#上一条取反 | |
db.user.find({"_id":{"$not":{"$mod":[2,1]}}}) |
# 成员运算
成员运算无非 in 和 not in,MongoDB 中形式为 $in , $nin
#1、select * from user where age in (1,2,3); | |
db.user.find({"age":{"$in":[1,2,3]}}) | |
#2、select * from user where name not in ("zhangsan","lisi"); | |
db.user.find({"name":{"$nin":["zhangsan","lisi"]}}) |
# $type 操作符
MongoDB 中可以使用的类型如下表所示:
# 查询 name 是字符串类型的数据 | |
db.user.find({name:{$type:2}}).pretty() |
# 正则
正则定义在 // 内
#1、select * from user where name regexp '^z.*?(u|i)$'; #匹配规则:z 开头、n 或 u 结尾,不区分大小写 | |
db.user.find({'name':/^z.*?(n|u)$/i}) |
# 投影
MongoDB 投影意思是只选择必要的数据而不是选择一整个文件的数据。
在 MongoDB 中,当执行 find () 方法,那么它会显示一个文档所有字段。要限制这一点, 需要设置的字段列表值 1 或 0。
1 用来显示字段而 0 是用来隐藏字段,_id 会默认显示出来。
#1 、 select name,age from user where id=3; | |
db.user.find({'_id':3},{'_id':0,'name':1,'age':1}) | |
#2、select name,age from user where name regexp "^z.*(n|u)$"; | |
db.user.find({"name":/^z.*(n|u)$/i},{"_id":0,"name":1,"age":1}) |
# 数组
#查询数组相关 | |
#查 hobbies 中有 dancing 的人 | |
db.user.find({ "hobbies":"dancing"}) | |
#查看既有 dancing 爱好又有 tea 爱好的人 | |
db.user.find({ "hobbies":{"$all":["dancing","tea"]}}) | |
#查看索引第 2 个爱好为 dancing 的人 | |
db.user.find({ "hobbies.2":"dancing"}) | |
#查看所有人的第 1 个到第 3 个爱好,第一个 {} 表示查询条件为所有,第二个是显示条件 | |
db.user.find({}, | |
{ | |
"_id":0, | |
"name":0, | |
"age":0, | |
"addr":0, "hobbies":{"$slice":[0,2]}, | |
} | |
) | |
#查看所有人最后两个爱好,第一个 {} 表示查询条件为所有,第二个是显示条件 | |
db.user.find({},{"_id":0,"name":0,"age":0,"addr":0, "hobbies":{"$slice":-2},}) | |
#查询子文档有 "country":"China" 的人 | |
db.user.find({"addr.country":"China"}) |
# 排序
在 MongoDB 中使用使用 sort () 方法对数据进行排序,sort () 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 - 1 是用于降序排列。
# 按姓名正序 db.user.find ().sort ({"name":1}) # 按年龄倒序 按 id 正序 | |
db.user.find().sort({"age":-1,'_id':1}) |
# 索引
# 创建索引
索引通常能够极大的提高查询的效率,MongoDB 使用 ensureIndex () 方法来创建索引, 其基本语法格式如下所示:
db.COLLECTION_NAME.ensureIndex({KEY:1}) |
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,-1 则为按降序来创建索引
db.user2.ensureIndex({"name":-1}) |
我们可以指定所建立索引的名字,如下所示:
db.user.ensureIndex({"name":1},{"name":"nameIndex"}) |
ensureIndex () 接收可选参数,可选参数列表如下
# 查询索引
查询索引的语法格式如下所示:
db.COLLECTION_NAME.getIndexes() | |
db.user.getIndexes() |
也可以在可视化工具中添加索引
# 删除索引
删除索引的语法格式如下所示:
db.COLLECTION_NAME.dropIndex(INDEX_NAME) | |
db.user.dropIndex("nameIndex") |