(十二)学习笔记:MongoDB数据库总结

MongoDB数据库

MongoDB将数据存储为文档 数据结构由键值对组成的,MongoDB的文档类似于json对象 字段的值可以是文档, 数组以及文档数组(包含多个文档的数组)

MongoDB和MySQL概念的区别:

SQL概念 MongoDB概念 解释说明
database database 数据库
table(表) collection(集合) 数据库的表/集合
row(一行数据) document(文档) 数据记录的行/文档
column field(域) 字段的列/域
index index 索引
table joins 表的联查
primary key primary key 主键/MongoDB自动将_id作为主键

主键

  1. 文档中的键值都是有序的
  2. MongoDB区分大小写
  3. 不能有重复的键, 再次插入会被覆盖掉
  4. 文档的键为字符串的类型

一. 启动MongoDB数据库

(1) cd mongodb/bin目录
(2) mongod.exe --dbpath = 数据库的安装位置(我的在db/data目录)
(3) 开启一个新的终端
(4) cd mongodb/bin目录
(5) mongo.exe 启动数据库

二. 对于mongo数据库的操作

(1) 查看数据库
show dbs;
(2) 创建或选择数据库
use 库名;
注意:
1.如果库不存在,使用这个语句会创建数据库
2.如果数据库存在,则进行数据库的切换
3.数据库创建出来使用show dbs;不会显示出来,需要在数据库中插入内容,才能查看到。
(3) 查看当前所在的数据库
(1) 直接输入db
(2) db.getName()
(4) 创建集合
db.createCollection('集合名称')
(5)查看当前的集合
show collections;
(6) 插入文档
db.集合名.insert({'键':'值'})
例如: db.user.insert({'name':'zs', age:18, gender:'male'})
注意:
1,在MongoDB中,对于集合, 文档的操作统一使用db
2,严格区分大小写
3,如果往不存在的集合插入数据,数据插入成功集合被创建
(7) 删除集合
db.集合名.drop()
例如: db.user.drop();
(8) 删除数据库
db.dropDatabase();

三.insert/save文档的添加

(1) insert就是纯添加数据
db.集合名.insert({文档})
(2) insert插入多条数据
db.集合名.insert([{文档1},{文档2},...])
注意:
如果不加[],调用insert不会报错, 但是只有第一条数据能够插入成功。
(3) 版本3.x以后推荐使用的方法
3.1) db.集合名.insertOne()
例如: db.user.insertOne({'name':'ls','age':20,'gender':'female'}) # 如果写多个文档, 也只有第一个文档会被成功插入
3.2) db.集合名.insertMany()
例如: db.user.insertMany([{'name':'aa'},{'name':'bb'}])
3.3) 使用save
save()方法 既可以插入文档,又可以覆盖文档。

  • 插入文档
    db.user.save({文档})
  • 覆盖文档
    db.user.save({"_id":ObjectId("5a5f0d610e0a34c28cb79342"), name:'芙蓉姐姐'}) # 将原来的id对应的值进行覆盖,原来的文档删除了, _id 一定要写上ObjectId("xxx"), 当save指定唯一_id的时候为覆盖 否则为添加文档

四. MongoDB的条件操作符

$gt 大于  db.集合名.find({age:{$gt:10}})  # 查找年龄大于10的记录
$gte 大于等于  db.集合名.find({age:{$gte:10}})  # 查找年龄大于等于10的记录
$lt 小于  db.集合名.find({age:{$lt:10}})  # 查找年龄小于10的记录
$lte 小于等于  db.集合名.find({age:{$lte:10}})  # 查找年龄小于等于10的记录
{key: value}  等于  db.集合名.find({age:10})  # 查询年龄为10的记录
$ne  不等于  db.集合名.find({age:{$ne:10}})  # 查询年龄不等于10的记录
使用id进行查询  db.集合名.find({"_id":ObjectId("5a5eef3...")})
/数据/  包含查询  db.集合名.find({name:/张/})  # 名字包含张的记录
/^数据/  以..开头  db.集合名.find({name:/^张/})  # 以张为开头的记录
/数据$/  以..结尾  db.集合名.find({name:/四$/})  # 查询以四结尾的记录
$in  在..里   db.集合名.find({age:{$in:[10,20,30]}})  # 查询年龄的值为10,20,30的记录
$nin  不在..里   db.集合名.find({age:{$nin:[10,20,30]}})  # 查询年龄不为10,20,30的记录

五. update更新文档

语句主体结构:

db.集合名.update(
  <query>,
  <update>,
  {
      upsert:<boolean>,
      multi:<boolean>
  }
)
解释:
<query>:update的查询语句,有点类似sql的where后面的条件
<update>:更新操作。 其中 $inc累加修改;  $set直接修改
upsert:当修改的数据不存在的时候是否作为新的数据插入,默认为false
multi:当查询条件查询到多条数据的时候,是修改一条数据还是修改多条数据,默认false只修改一条 

实例:对people集合进行操作
(1) 首先在数据库中插入数据


(2) 将名字为张三的第一条数据年龄修改为18
db.people.update({name:'张三'},{$set:{age: 28}})

(3) 当查询条件不能匹配到数据的时候,不会对任何数据进行修改

(4) 如果将upsert设置为true,当查询条件不能匹配到数据的时候,执行插入操作

(5) update语句默认是对一条记录进行修改的,我们可以设置multi:true用于对多条记录进行修改, 在这里我们将所有名字以张开头的人的年龄加10岁

(6) 和可以使用与操作,将名字为张开头,年龄为29的减10岁

版本3.x以后推荐使用的方法

  • db.集合名.updateOne() # 修改一条记录
    例如: db.people.updateOne({age:{$in:[38,19]}}, {$inc:{age:10}}) # 可以匹配到多条数据,但是只会修改一条数据,如果设置multi为true也只会修改一条数据
  • db.集合名.updateMany() # 修改多条数据
    例如:db.people.updateMany({age:{$in:[38,19]}}, {$inc:{age: 10}}) # 修改了多条数据

六. find查询

(1) 查询所有记录
db.集合名.find();
(2) 查询结果指定某个字段进行显示或不显示
db.集合名.find(条件, {name:1, age:true}); # 只返回指定的字段,默认_id是返回的。即返回_id, name和age对应的字段, 使用1或者true都可以
db.集合名.find({}, {name:false, age:0}); # 返回除了name和age的其他字段

注意:
(1) db.集合名.find({}, {name:true, age:false}); # error 错误的写法, 一般情况下,显示和不显示模式不能混用, 上述name只返回name, age返回除了age以外的,产生错误。
(2) db.集合名.find({}, {_id: 0, name: true, age:true}); # ok _id默认是显示的,需要手动设置为0/false才会隐藏显示

(3) 查询一条记录
db.集合名.findOne(); # 返回了第一条数据
(4) 统计数据条数
db.集合名.find().count();
(5) 将数据展开来查看
db.集合名.find().pretty();
(6) 排序
db.集合名.find().sort({'age':1}); # 其中1为升序, -1为降序
(7) 指定数量的记录
db.集合名.find().sort({age:1}).limit(4); # 安装age升序排序取前4个
(8) 跳过指定数量的记录
db.集合名.find().skip(2); # 跳过2条数据

六. remove删除

(1) 使用remove() 删除
语法格式:

db.集合名.remove(
  <query>,
  {
    justOne:<boolean>,
  }
)
解释:
<query>:查询条件
justOne:设置true/1 是否只删除一个,默认为false

# 删除title为aa的
db.集合名.remove({'title':'aa'})
# 删除所有的文档
db.集合名.remove({})

(2) 使用deleteOne() 和deleteMany() 删除

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

推荐阅读更多精彩内容