MongoDB的使用

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字段相同值的总和。

下表展示了一些聚合的表达式:


聚合表达式

文章参考:http://www.runoob.com/mongodb/mongodb-tutorial.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1、MongoDB概念解析: 2、数据库: "show dbs"命令可以显示所有数据的列表。"db"命令可以显示当...
    妮妮爱布阅读 574评论 0 0
  • MongoDB文档 MongoDB 概念解析 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基...
    birdflying阅读 1,977评论 0 27
  • 在客户端指定数据库进行连接:(默认连接本机test数据库) [mongod@MongoDB ~]$ mongo10...
    xueyue77阅读 210评论 0 0
  • 简介 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性...
    birjemin阅读 303评论 0 1
  • 当我读到“凤凰涅磐”这几个字的时候,脑海中会浮现一只凤凰冲进熊熊的烈火,然后涅槃飞向九天的画面,凤凰在百般...
    水到渠成111阅读 231评论 0 3