mongodb的创建,删除,查询数据库、集合、文档操作

数据库(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 );

语句中$incincrement的缩写,所以更新的是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 语句比较

compare.png

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 } ]
}

参考资料

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

推荐阅读更多精彩内容

  • MongoDB的使用 MongoDB的搭建 成功运行 将mongoDB设置为windows服务 将mongoDB的...
    小西奥阅读 975评论 0 0
  • MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据...
    LittlePy阅读 1,586评论 0 4
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,359评论 0 9
  • MongoDB文档 MongoDB 概念解析 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基...
    birdflying阅读 1,998评论 0 27
  • 新的开始了,就意味着一天的生活开始了,好的开始也有好的结尾
    成佳玉阅读 188评论 0 0