MONGO学习笔记(三、MongoDB CURD)

MongoDB的语法和传统关系型数据库语法不同,它调用的是JavaScript提供的API接口。例如:

添加数据

单行数据插入(insert)

use appdb 
db.book.insert({
  title: 'my first book',
  publishedData : new Date(),
  tags: [
  'MongoDB',
  'nosql'
  ],
  favCount: 25,
  author: 'zale' ,
})
请添加图片描述

WriteResult({ "nInserted" : 1 }) 表示插入数据成功

由于MongoDB属于文档型数据库,它不像关系型数据库一样有着特定的格式,所以你可以在数据库中插入任意结构数据,但不推荐这样做;例如

db.book.insert({
    title:'我的第一本书',
    author:"liuliuliu",
    icon: "这是书的封面",
    utl:'http://book.zhouhc.test.com'
})
请添加图片描述

这时的数据库中:


请添加图片描述

表结构为:


请添加图片描述

无限制的插入,项目必然无法维护。

批量插入

批量插入用到的方法:

db.book.insertMany();

以下是例子:

db.book.insertMany([{
    title:'批量插入',
    author:'zhohc',
    publishedData: new Date(),
    tags:['mongo', '批量插入'],
    favCount: 19
}, {
    title:'批量插入',
    author:'zhohc',
    publishedData: new Date(),
    tags:['mongo', '批量插入'],
    favCount: 19
}])

该语句的执行结果如下:


请添加图片描述
请添加图片描述

当然也可以通过js脚本的方式批量插入数据, 如下:


请添加图片描述

这段js脚本会向MongoDB中插入20条数据.这里就不执行,想试的可以自己去弄。

查询文档(find)

查询全部数据

db.collection.find()方法可以用于集合数据的查询,代码如下:

db.book.find()
请添加图片描述

如果查询返回的条目数量比较多,Mongo shell则会自动实现分批查询,默认情况下每次显示20条数据,可以输入it命令读取下一批。
实际上,find命令返回的是一个游标(cursor)对象,Mongo shell对batchSize做了限制,该大小可以通过变量DBQuery.shellBatchSize修改。
使用游标对象提供的API,可以对全部结果集进行遍历,代码如下:

var cursor = db.book.find()
cursor.forEach(printjson)

执行结果如下:


请添加图片描述

指定条件查询

准备数据

db.aaa.insert({id: 1, user:'zhouhc1', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 2, user:'zhouhc2', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 3, user:'zhouhc3', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 4, user:'zhouhc4', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 5, user:'zhouhc5', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 6, user:'zhouhc6', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 7, user:'zhouhc7', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 8, user:'zhouhc8', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 9, user:'zhouhc9', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 10, user:'zhouhc10', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 11, user:'zhouhc11', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 12, user:'zhouhc12', pwd:'hello', icon: '图标'})

请添加图片描述

几种常见的操作
MongoDB的比较操作符见下表
请添加图片描述

几种逻辑运算符
请添加图片描述

数组运算符


请添加图片描述
  1. 查询id为"1"的用户信息
db.aaa.find({id: 1})
请添加图片描述
  1. 查询用户ID大于5的用户信息
db.aaa.find({id: {$gt: 5}})

该语句执行结果如下:


请添加图片描述
  1. 排序,分页
  • 查询用户ID大于5的用户信息,且按照id降序
    db.aaa.find({id:{$gt: 5}}).sort({id: -1})
    
    该语句执行结果如下:
请添加图片描述
  • 分页查询
    分页查询主要有两个参数

    • skip: 用于指定跳过记录数
    • limit: 用于限定返回结果数

    例如:
    查询id>5的用户,且按照每页2条数据进行分页,取第二页

    db.aaa.find({id: {$gt: 5}}).skip(2).limit(2)
    
请添加图片描述

更新文档(update)

更新操作符

请添加图片描述

请添加图片描述

基本语法格式

MongoDB中可以用update命令对指定的数据进行更新,命令的格式如下:

db.{collection}.update(query, update, options)

参数说明:

  • query: 描述更新的查询条件
  • update: 描述更新的动作以及新的内容
  • options: 描述更新的选项
  1. 更新单条数据
    例如: 将id = 1的用户,用户名修改为liuliuliu,
db.aaa.update({id: 1},{$set: {user: 'liuliuliu'}})

该语句执行结果如下:


请添加图片描述

通过查询,可以看到id=1的数据user已经更新了

请添加图片描述

默认情况下,update命令在更新第一个文档之后返回。(也就是说,默认情况下update命令只更新一个文档),如果需要更新多条数据,如下

  1. 更新多条数据
    更新多条数据用到Options参数multi
    参数介绍
  • multi: 是否更新多条数据,默认false
    基础语法如下:
db.aaa.update(
    {id: {$gt : 10}}, 
    {$set: {user: 'liuliuliu'}},
    {multi: true}
)

上面这个更新语句是说:将所有用户id>10的用户,user修改为liuliuliu

请添加图片描述

通过命令可以看到,id in (11,12)的两条数据已经修改为:liuliuliu了

请添加图片描述
  1. 其他指令
  • updateOne: 更新单个文档

  • updateMany: 更新多个文档

  • replaceOne: 替换单个文档

  • findAndMondify: 这个命令兼容查询和修改指定文档的功能,如下图


    请添加图片描述

    默认返回的是旧数据,可以通过选项: new:true,返回最新的结果
    例如:


    请添加图片描述
  1. 其他
  • upsert命令
    upsert是一种特殊的更新的命令,其表现为如果目标文档不存在,则执行插入命令,代码如下:


    请添加图片描述

删除文档(delete)

删除单个文档

执行下面的命令可以删除单个文档

db.aaa.remove({id:11})

请添加图片描述

可以看到文档已经删除了, 查询结果如下
请添加图片描述

注意:删除命令会删除所有匹配条件的全部文档,如果希望明确限定只删除一个文档,则需要指定justOne参数。
命令格式如下:

db.collection.remove({
  <query>,
  <justOne>
})

例如:

db.collection.remove({id: 1}, true)

在MongoDB 3.2版本提供了delete语法定义,因此也可以使用deleteOne命令实现删除单个文档。
例如:

db.aaa.deleteOne({user: 'liuliuliu'})
请添加图片描述

删除全部文档

删除全部文档有三种方式,如下:

db.aaa.remove({})
db.aaa.deleteMany({})
db.aaa.drop()

方式1、2需要对查询范围内的文档逐个删除,如果希望删除整个集合(表),则使用drop命令会更加高效。
drop命令会同时删除集合的全部索引。

返回被删除的数据

如果希望返回删除的数据可以使用命令:findOneAndDelete命令, 示例如下:

db.aaa.findOneAndDelete({id: 10})

执行结果如下:


请添加图片描述

小结

请添加图片描述

参考

《MongoDB进阶与实战:微服务整合、性能优化、架构管理》

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

推荐阅读更多精彩内容