MongoDB基本操作
创建数据库
语法
MongoDB 创建数据库的语法格式如下:
1 | use DATABASE_NAME |
如果数据库不存在,则创建数据库,否则切换到指定数据库。
实例
以下实例我们创建了数据库 blog
1 | use blog |
如果你想查看所有数据库,可以使用 show dbs 命令:
1 | show dbs |
可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 blog数据库插入一些数据。
1 | db.blog.insert({"name":"晓风残月的blog"}) |
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
删除数据库
语法
MongoDB 删除数据库的语法格式如下:
1 | db.dropDatabase() |
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
实例
以下实例我们删除了数据库 blog。
首先,查看所有数据库:
1 | show dbs |
接下来我们切换到数据库 blog:
1 | use blog |
执行删除命令:
1 | db.dropDatabase() |
最后,我们再通过 show dbs 命令数据库是否删除成功:
1 | show dbs |
创建集合
语法
MongoDB 中使用 createCollection() 方法来创建集合。
1 | db.createCollection(name, options) |
参数说明:
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,以千字节计(KB)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
实例
在 test 数据库中创建 blog 集合:
1 | use test |
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
1 | show tables |
下面是带有几个关键参数的 createCollection() 的用法:
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
1 | db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 }) |
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
1 | db.mycol5.insert({"name" : "晓风残月"}) |
删除集合
语法
MongoDB 中使用 drop() 方法来删除集合。
1 | db.collection.drop() |
返回值
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
实例
在数据库 blog中,我们可以先通过 show collections 或者 show collections 命令查看已存在的集合:
1 | use test |
通过 show collections 再次查看数据库 test中的集合:
1 | show collections |
从结果中可以看出 所有的集合已被删除。
插入文档
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
语法
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
1 | db.collection.insert(document) |
实例
普通插入
以下文档可以存储在 MongoDB 的 test数据库 的 blog集合中:
1 | use test |
以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
查看已插入文档
1 | db.blog.find() |
定义变量插入
我们也可以将数据定义为一个变量,如下所示:
1 | document=({title: 'MongoDB 教程', |
执行后显示结果如下:
1 | { |
执行插入操作
1 | db.blog.insert(document) |
插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
update() 方法
语法
update() 方法用于更新已存在的文档。语法格式如下:
1 | db.collection.update( |
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
实例
我们在集合 blog中插入如下数据:
1 | db.blog.insert({title: 'MongoDB 教程', |
接着我们通过 update() 方法来更新标题(title):
1 | db.blog.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) |
可以看到标题(title)由原来的 “MongoDB 教程” 更新为了 “MongoDB”。
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
1 | db.blog.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true}) |
save() 方法
语法
save() 方法通过传入的文档来替换已有文档。语法格式如下:
1 | db.collection.save( |
参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
实例
以下实例中我们替换了 _id 为 5e3d22117e132b8078babb03 的文档数据:
1 | db.blog.save({ |
替换成功后,我们可以通过 find() 命令来查看替换后的数据
1 | db.blog.find().pretty() |
更多实例
只更新第一条记录:
db.blog.update( { “count” : { $gt : 1 } } , { $set : { “test2” : “OK”} } );
全部更新:
db.blog.update( { “count” : { $gt : 3 } } , { $set : { “test2” : “OK”} },false,true );
只添加第一条:
db.blog.update( { “count” : { $gt : 4 } } , { $set : { “test5” : “OK”} },true,false );
全部添加进去:
db.blog.update( { “count” : { $gt : 5 } } , { $set : { “test5” : “OK”} },true,true );
全部更新:
db.blog.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );
只更新第一条记录:
db.blog.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );
删除文档
MongoDB remove()函数是用来移除集合中的数据。
MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
语法
remove() 方法的基本语法格式如下所示:
1 | db.collection.remove( |
如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
1 | db.collection.remove( |
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
实例
使用 find() 函数查询数据:
1 | db.blog.find().pretty() |
接下来我们移除 title 为 ‘MongoDB 教程-save保存’ 的文档:
1 | db.blog.remove({'title':'MongoDB 教程-save保存'})) |
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
1 | db.collection.remove(DELETION_CRITERIA,1) |
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
1 | db.blog.remove({}) |
deleteMany
remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。
如删除集合下全部文档:
1 | db.blog.deleteMany({}) |
删除 title 等于 MongoDB 的全部文档:
1 | db.blog.deleteMany({ title : "MongoDB" }) |
查询文档
MongoDB 查询文档使用 find() 方法。
find() 方法以非结构化的方式来显示所有文档。
语法
MongoDB 查询数据的语法格式如下:
1 | db.collection.find(query, projection) |
参数说明:
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
1 | db.blog.find().pretty() |
pretty() 方法以格式化的方式来显示所有文档。
实例
以下实例我们查询了集合 blog中的数据:
1 | db.blog.find().pretty() |
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
1 | db.blog.findOne() |
与 RDBMS Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {: } |
db.col.find({"by":"菜鸟教程"}).pretty() |
where by = '菜鸟教程' |
小于 | {:{$lt:}} |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | {:{$lte:}} |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | {:{$gt:}} |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | {:{$gte:}} |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | {:{$ne:}} |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法
1 | db.collection.find({key1:value1, key2:value2}).pretty() |
实例
以下实例通过 aouth 和 title 键来查询 晓风残月 中 MongoDB 教程 的数据
1 | db.blog.find({'aouth':'晓风残月','title':'MongoDB 教程'}).pretty() |
以上实例中类似于 WHERE 语句:WHERE aouth=’晓风残月’ AND title=’MongoDB 教程’
OR 条件
语法
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
1 | db.col.find( |
实例
以下实例中,我们演示了查询键 aouth 值为 晓风残月 或键 title 值为 MongoDB 教程 的文档。
1 | db.blog.find({$or:[{'aouth':'晓风残月'},{'title':'MongoDB 教程'}]}).pretty() |
AND 和 OR 联合使用
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (aouth = ‘晓风残月’ OR title = ‘MongoDB 教程’)’
1 | db.blog.find({'likes':{$gt:50}},{$or:[{'aouth':'晓风残月'},{'title':'MongoDB 教程'}]}).pretty() |