数据库(database)操作
1.创建数据库
>use dept
使用use
命令即可创建数据库dept
2.删除数据库
>db.dropDatabase()
此命令删除当前数据库
3.查询数据库
>show dbs
注意:此命令用于查看存在集合的所有数据库,而新创建的数据库里若没有创建collections,那么此命令也是看不到新创建的数据库的
查看当前数据库的命令:
>db
集合(collections)操作
1.创建集合
语法格式:
>db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
-
options: 可选参数, 指定有关内存大小及索引的选项
-
options详解
opt.png
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
-
实例
在 test 数据库中创建 runoob 集合:
> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
>
下面是带有几个关键参数的 createCollection()
的用法:
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
> db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
{ "ok" : 1 }
>
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> db.mycol2.insert({"name" : "菜鸟教程"})
> show collections
mycol2
...
2.删除集合
语法格式:
>db.collection.drop()
删除成功返回 true ,否则返回 false
实例
删除集合 mycol2 :
>db.mycol2.drop()
true
>
3.查看集合
>show collections
或者是
>show tables
文档(documents)操作
1.创建文档
命令语法:
>db.COLLECTION_NAME.insert(document)
以上命令中COLLECTION_NAME
是指我们的集合名称,document
是指我们要插入的文档对象
实例
以下文档可以存储在 MongoDB 的 runoob 数据库 的 col 集合中:
>db.col.insert({title: haohaoxuexi',
description: 'tiantianzhuanqian',
by: 'zhilimingyan',
url: 'http://www.example.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
我们也可以将数据定义为一个变量,如下所示:
> document=({{title: haohaoxuexi',
description: 'tiantianzhuanqian',
by: 'zhilimingyan',
url: 'http://www.example.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
执行插入操作:
> db.col.insert(document)
WriteResult({ "nInserted" : 1 })
>
提醒:insert命令可以进行批量操作,只是操作的对象是数组,同时还有
insertOne(document)
和insertMany(document)
方法
2.更新文档
update() 方法用于更新已存在的文档。语法格式如下:
>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 :可选,抛出异常的级别。
*WriteConcern.NONE
:没有异常抛出
*WriteConcern.NORMAL
:仅抛出网络错误异常,没有服务器错误异常
*WriteConcern.SAFE
:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
*WriteConcern.MAJORITY
: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
*WriteConcern.FSYNC_SAFE
: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
*WriteConcern.JOURNAL_SAFE
:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
*WriteConcern.REPLICAS_SAFE
:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
实例
我们在集合 col 中插入如下数据:
>db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB数据库',
by: 'mine',
url: 'http://www.example.com',
tags: ['mongodb', 'database'],
likes: 100
})
接着我们通过 update() 方法来更新标题(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息
> db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB数据库",
"by" : "mine",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database"
],
"likes" : 100
}
>
pretty()方法是将结果json化,方便查看
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save()方法也可以更新文档,但是通过传入的文档来替换已有文档。语法格式如下:
>db.collection.save(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
实例
以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:
>db.col.save({
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "mine",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
替换成功后,我们可以通过 find() 命令来查看替换后的数据
>db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "mine",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
>
更多实例
只更新第一条记录,也可以使用updateOne()命令:
>db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
>db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
上条语句的后两个参数,false
是指数据不存在时不执行插入操作,true
是指更新符合条件的所有记录
只添加第一条:
>db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
上条语句的后两个参数,true
是指数据不存在时执行插入操作,false
是指更新符合条件的第一条记录
全部添加进去:
>db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
>db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
语句中$inc
是increment
的缩写,所以更新的是count属性 +1
自增
只更新第一条记录:
>db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
删除集合中的键值对,如果指定的字段不存在则操作不做任何处理。
>db.col.update({"_id":"56064f89ade2f21f36b03136"}, {$unset:{ "test2" : "OK"}})
3.删除文档
命令语法:
db.collection.remove(
<query>,
<justOne>
)
如果你的 MongoDB 是 2.6 版本以后至3.2版本以前的,语法格式如下:
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
实例
移除 title 为 'MongoDB 教程' 的文档:
>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 }) # 删除了两条数据
>db.col.find()
…… # 没有数据
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
不过我更推荐使用deleteOne()
方法
>db.COLLECTION_NAME.deleteOne(DELETION_CRITERIA)
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
>db.col.remove({})
或者是
>db.col.deleteMany({})
注意:
deleteOne()
和deleteMany()
方法是在3.2版本开始才有的功能,但我个人觉得它们的效率更高,不管是单体操作还是批量操作上,大家也可以从官方文档查找最新方法以及其它的方法(例:findOneAndDelete()
)
4.查询文档
命令语法:
>db.collection.find(query, projection)
参数:
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
实例
指定 projection 格式如下,有两种模式:
>db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
>db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
_id 键默认返回,需要主动指定 _id:0 才会隐藏
两种模式不可混用(因为这样的话无法推断其他键是否应返回)
>db.collection.find(query, {title: 1, by: 0}) // 错误
只能全1或全0,除了在inclusion模式时可以指定_id为0
>db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确
若不想指定查询条件参数 query 可以 用 {} 代替,但是需要指定 projection 参数:
>db.collection.find({}, {title: 1})
如果是 qty 大于 50 小于 80 不能这样写:
>db.collection.find( { qty: { $gt: 50 ,$lt: 80}} )
MongoDB 与 RDBMS Where 语句比较
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
实例
以下实例通过 by 和 title 键来查询 菜鸟教程 中 MongoDB 教程 的数据
> db.col.find({"by":"mine", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "mine",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database"
],
"likes" : 100
}
以上实例中类似于 WHERE 语句:WHERE by='mine' AND title='MongoDB 教程'
MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
实例
以下实例中,我们演示了查询键 by 值为 mine 或键 title 值为 MongoDB 教程 的文档。
>db.col.find({$or:[{"by":"mine"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "mine",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database"
],
"likes" : 100
}
>
AND 和 OR 联合使用
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = 'mine' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "mine"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "mine",
"url" : "http://www.example.com",
"tags" : [
"mongodb",
"database"
],
"likes" : 100
}
MongoDB In 条件
但是相对于$or
操作,$in
操作效率更高
下面的示例从 user 集合中检索 status 字段值为 "P" 或者 "D" 的所有文档:
>db.users.find( { status: { $in: [ "P", "D" ] } } )
嵌入文档上的精确匹配
在下面的例子中,查询匹配所有 favorites 字段是以该种顺序只包含 等于 "Picasso"的 artist
和等于 "pizza" 的 food
字段的内嵌文档:
>db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )
嵌入文档中字段上的等于匹配
在下面的例子中,查询使用dot notation匹配所有 favorites 字段是包含等于 "Picasso" 的字段artist
(可能还包含其他字段) 的内嵌文档:
>db.users.find( { "favorites.artist": "Picasso" } )
数组上的查询
数组上的精确匹配
下面的例子查询所有字段 badges 是一个正好有两个元素: "blue" 和 "black" (以这种顺序)的数组的文档:
>db.users.find( { badges: [ "blue", "black" ] } )
查询匹配下面的文档:
{
"_id" : 1,
"name" : "sue",
"age" : 19,
"type" : 1,
"status" : "P",
"favorites" : { "artist" : "Picasso", "food" : "pizza" },
"finished" : [ 17, 3 ]
"badges" : [ "blue", "black" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 85, "bonus" : 10 } ]
}
匹配一个数组元素
下面的示例查询 badges 是一个数组字段并且包含“black
作为其数组元素的所有文档。
>db.users.find( { badges: "black" } )
查询匹配下列文档:
{
"_id" : 1,
"name" : "sue",
"age" : 19,
"type" : 1,
"status" : "P",
"favorites" : { "artist" : "Picasso", "food" : "pizza" },
"finished" : [ 17, 3 ]
"badges" : [ "blue", "black" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 85, "bonus" : 10 } ]
}
匹配数组中的指定元素
在下面的例子中,查询使用dot notation匹配所有 dadges 数组的第一个元素为“black
的文档:
>db.users.find( { "badges.0": "black" } )
该操作返回下列文档:
{
"_id" : 6,
"name" : "abc",
"age" : 43,
"type" : 1,
"status" : "A",
"favorites" : { "food" : "pizza", "artist" : "Picasso" },
"finished" : [ 18, 12 ],
"badges" : [ "black", "blue" ],
"points" : [ { "points" : 78, "bonus" : 8 }, { "points" : 57, "bonus" : 7 } ]
}
指定数组元素的多个查询条件
单个元素满足查询条件
使用 $elemMatch 操作符为数组元素指定复合条件,以查询数组中至少一个元素满足所有指定条件的文档。
下面的例子查询 finished 数组至少包含一个大于15并且小于 20 的元素的文档:
>db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )
操作返回下列文档,文档的 finished 数组包含至少一个满足查询条件的元素。
{
"_id" : 1,
"name" : "sue",
"age" : 19,
"type" : 1,
"status" : "P",
"favorites" : { "artist" : "Picasso", "food" : "pizza" },
"finished" : [ 17, 3 ]
"badges" : [ "blue", "black" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 85, "bonus" : 10 } ]
}
{
"_id" : 6,
"name" : "abc",
"age" : 43,
"type" : 1,
"status" : "A",
"favorites" : { "food" : "pizza", "artist" : "Picasso" },
"finished" : [ 18, 12 ],
"badges" : [ "black", "blue" ],
"points" : [ { "points" : 78, "bonus" : 8 }, { "points" : 57, "bonus" : 7 } ]
}
元素组合满足查询条件
下面的例子查询 finished 数组包含以某种组合满足查询条件的元素的文档;
例如,一个元素满足大于 15 的条件并且有另一个元素满足小于 20 的条件,或者有一个元素满足了这两个条件:
>db.users.find( { finished: { $gt: 15, $lt: 20 } } )
操作返回下面的文档:
{
"_id" : 1,
"name" : "sue",
"age" : 19,
"type" : 1,
"status" : "P",
"favorites" : { "artist" : "Picasso", "food" : "pizza" },
"finished" : [ 17, 3 ]
"badges" : [ "blue", "black" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 85, "bonus" : 10 } ]
}
{
"_id" : 2,
"name" : "bob",
"age" : 42,
"type" : 1,
"status" : "A",
"favorites" : { "artist" : "Miro", "food" : "meringue" },
"finished" : [ 11, 20 ],
"badges" : [ "green" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 64, "bonus" : 12 } ]
}
{
"_id" : 6,
"name" : "abc",
"age" : 43,
"type" : 1,
"status" : "A",
"favorites" : { "food" : "pizza", "artist" : "Picasso" },
"finished" : [ 18, 12 ],
"badges" : [ "black", "blue" ],
"points" : [ { "points" : 78, "bonus" : 8 }, { "points" : 57, "bonus" : 7 } ]
}