mongoDB 命令
在Linux下使用mongo进入MongoDB命令行
mongo
创建和使用数据库
> use mongo
switched to db mongo
> db
mongo
>
查看所有数据库
> show dbs
admin 0.000GB
local 0.000GB
>
我们刚创建的数据库 runoob并不在数据库的列表中, 要显示它,我们需要向 runoob数据库插入一些数据。
> db.runoob.insert({"name":"菜鸟教程"})
WriteResult({ "nInserted" : 1 })
> show dbs
local 0.078GB
runoob 0.078GB
test 0.078GB
>
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
注意: 在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
删除数据库
MongoDB删除数据库的语法格式如下:
db.dropDatabase()
删除当前数据库,默认为 test,你可以使用 db命令查看当前数据库名。
> use runoob
switched to db runoob
>
执行删除命令:
> db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }
MongoDB 创建集合
MongoDB中使用 createCollection()方法来创建集合。
语法格式:
db.createCollection(name, options)
参数说明:
* name:要创建的集合名称
* options:可选参数,指定有关内存大小及索引的选项
options可以是如下参数:
字段 /类型/描述
capped /布尔 /(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
当该值为 true时,必须指定 size参数。
autoIndexId /布尔 /(可选)如为 true,自动在 _id字段创建索引。默认为 false。
size /数值 /(可选)为固定集合指定一个最大值(以字节计)。
如果 capped为 true,也需要指定该字段。
max /数值 /(可选)指定固定集合中包含文档的最大数量。
在 test数据库中创建 runoob集合:
> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
>
如果要查看已有集合,可以使用 show collections命令:
> show collections
runoob
system.indexes
下面是带有几个关键参数的 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
...
MongoDB删除集合
MongoDB中使用 drop()方法来删除集合。
语法格式:
db.collection.drop()
参数说明:
无
返回值
如果成功删除选定集合,则 drop()方法返回 true,否则返回 false。
我们可以先通过 show collections命令查看已存在的集合:
>use mydb
switched to db mydb
>show collections
mycol
mycol2
system.indexes
runoob
>
接着删除集合 mycol2 :
>db.mycol2.drop()
true
>
通过 show collections再次查看数据库 mydb中的集合:
>show collections
mycol
system.indexes
runoob
>
从结果中可以看出 mycol2集合已被删除。
MongoDB 插入文档
文档的数据结构和JSON基本一样。
所有存储在集合中的数据都是BSON格式。
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。
插入文档
MongoDB使用 insert()或 save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
实例
以下文档可以存储在 MongoDB的 runoob数据库 的 col集合中:
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
以上实例中 col是我们的集合名,如果该集合不在该数据库中, MongoDB会自动创建该集合并插入文档。
查看已插入文档:
> db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
我们也可以将数据定义为一个变量,如下所示:
> document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
执行后显示结果如下:
{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
执行插入操作:
> db.col.insert(document)
WriteResult({ "nInserted" : 1 })
>
插入文档你也可以使用 db.col.save(document)命令。如果不指定 _id字段 save()方法类似于 insert()方法。如果指定 _id字段,则会更新该 _id的数据。
插入多个文档
db.col.insert([{
"title": 'MongoDB Overview',
"description": 'MongoDB is no sql database',
"by_user": 'runoob.com',
"url": 'http://www.runoob.com',
"tags": ['mongodb', 'database', 'NoSQL'],
"likes": 100
},{
"title": 'MongoDB Overview',
"description": 'No sql database is very fast',
"by_user": 'runoob.com',
"url": 'http://www.runoob.com',
"tags": ['mongodb', 'database', 'NoSQL'],
"likes": 10
}
)
MongoDB 更新文档
MongoDB使用 update()和 save()方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
update()方法
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 :可选,抛出异常的级别。
通过 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 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}>
可以看到标题(title)由原来的 "MongoDB教程"更新为了 "MongoDB"。
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi参数为 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
在3.2版本开始,MongoDB提供以下更新集合文档的方法:
db.collection.updateOne()向指定集合更新单个文档
db.collection.updateMany()向指定集合更新多个文档
首先我们在test集合里插入测试数据
use test
db.test_collection.insert( [
{"name":"abc","age":"25","status":"zxc"},
{"name":"dec","age":"19","status":"qwe"},
{"name":"asd","age":"30","status":"nmn"},
] )
更新单个文档
> db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "zxc" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "qwe" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "nmn" }
>
更新多个文档
> db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "xyz" }
>
MongoDB 删除文档
语法
remove()方法的基本语法格式如下所示:
db.collection.remove(query,justOne)
如果你的 MongoDB是 2.6版本以后的,语法格式如下:
db.collection.remove(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)
如果你想删除所有数据,可以使用以下方式(类似常规 SQL的 truncate命令):
>db.col.remove({})
>db.col.find()
>
remove()方法已经过时了,现在官方推荐使用 deleteOne()和 deleteMany()方法。
如删除集合下全部文档:
db.inventory.deleteMany({})
删除 status等于 A的全部文档:
db.inventory.deleteMany({ status : "A" })
删除 status等于 D的一个文档:
db.inventory.deleteOne( { status: "D" } )
remove()方法 并不会真正释放空间。
需要继续执行 db.repairDatabase()来回收磁盘空间。
> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })
MongoDB 查询文档
MongoDB查询文档使用 find()方法。
find()方法以非结构化的方式来显示所有文档。
语法
MongoDB查询数据的语法格式如下:
db.collection.find(query, projection)
* query:可选,使用查询操作符指定查询条件
projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty()方法,语法格式如下:
>db.col.find().pretty()
pretty()方法以格式化的方式来显示所有文档。
MongoDB AND 条件
MongoDB的 find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL的 AND条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
通过 by和 title键来查询 菜鸟教程 中 MongoDB教程 的数据
> db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : ["mongodb", "database","NoSQL"],
"likes" : 100
}
类似于 WHERE语句:WHERE by='菜鸟教程' AND title='MongoDB教程'
MongoDB OR 条件
MongoDB OR条件语句使用了关键字 $or,语法格式如下:
>db.col.find({$or: [{key1: value1}, {key2:value2}]}).pretty()
实例
以下实例中,我们演示了查询键 by值为 菜鸟教程 或键 title值为 MongoDB教程 的文档。
>db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : ["mongodb","database","NoSQL"],
"likes" : 100
}
>
AND 和 OR 联合使用
以下实例演示了 AND和 OR联合使用,类似常规 SQL语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : ["mongodb","database","NoSQL"],
"likes" : 100
}
补充
如果是 likes 大于 50 小于 80 不能这样写:
db.col.find( { likes: { $gt: 50 ,$lt: 80}} )
projection 参数的使用方法
projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
db.collection.find(query, projection)
若不指定 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参数:
querydb.collection.find({}, {title: 1})
MongoDB 条件操作符
描述
条件操作符用于比较两个表达式并从mongoDB集合中获取数据。
MongoDB中条件操作符有:
* (>)大于 - $gt
* (<)小于 - $lt
* (>=)大于等于 - $gte
* (<= )小于等于 - $lte
###MongoDB 操作符 - $type 实例
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB中可以使用的类型如下表所示:
想获取 "col"集合中 title为 String的数据,你可以使用以下命令:
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
MongoDB Limit() 方法
在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
语法
limit()方法基本语法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
显示查询文档中的两条记录:
> db.col.find({},{"title":1,_id:0}).limit(2)
注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。
MongoDB Skip() 方法
我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
语法
skip()方法脚本语法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
实例
以下实例只会显示第二条文档数据
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
>
注:skip()方法默认参数为 0。
MongoDB 排序
在 MongoDB中使用 sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1和 -1来指定排序的方式,其中 1为升序排列,而 -1是用于降序排列。
语法
sort()方法基本语法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})
当sort,skip,limit一起使用时,无论其位置变化,总是先sort再skip,最后limit。
如果要改变执行顺序,用aggregate
MongoDB 索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
createIndex()方法
MongoDB使用 createIndex()方法来创建索引。
注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
语法
createIndex()方法基本语法格式如下所示:
>db.collection.createIndex(keys, options)
语法中 Key值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为 -1即可。
实例
>db.col.createIndex({"title":1})
>
createIndex()方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
>db.col.createIndex({"title":1,"description":-1})
>
createIndex()接收可选参数,可选参数列表如下:
在后台创建索引:
db.values.createIndex({open: 1, close: 1}, {background: true})
通过在创建索引时加 background:true的选项,让创建工作在后台执行
* 1、查看集合索引
db.col.getIndexes()
2、查看集合索引大小
db.col.totalIndexSize()
* 3、删除集合所有索引
db.col.dropIndexes()
* 4、删除集合指定索引
db.col.dropIndex("索引名称")
MongoDB 聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
aggregate()方法
MongoDB中聚合的方法使用aggregate()。
语法
aggregate()方法的基本语法格式如下所示:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
计算每个作者所写的文章数,使用aggregate()计算结果如下:
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{"result" : [{"_id" : "runoob.com","num_tutorial" : 2},{"_id" : "Neo4j","num_tutorial" : 1}],"ok" : 1}
>
以上实例类似sql语句:
select by_user, count(*) from mycol group by by_user
在上面的例子中,我们通过字段 by_user字段对数据进行分组,并计算 by_user字段相同值的总和。
下表展示了一些聚合的表达式: