梭哈Mongodb常用操作

本文首发于博主公众号LISTONE,欢迎关注哦!

博主公众号

Mongodb简介

Mongodb是一种非关系性数据库(nosql)。

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

下面是sql与mongodb术语对比:

SQL Mongodb
表(Talbe) 集合(Collection)
行(Row) 文档(Document)
列(Col) 字段(Field)
主键(Primary Key) 对象ID(ObjectID)
索引(Index) 索引(Index)
嵌套表(Embeded Table) 嵌入式文档(Embeded Document)
数组(Array) 数组(Array)

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。

{"name": "listone", "age": 22}

以上文档中有一个name键,其值为 listone ,age键值为 22

以这个文档为例,解释一下:

  • 文档中的键值对是有序的,上面例子中如果调换name和age的键值对,将会被视为一个新的文档。
  • 文档中的值不仅仅只限于字符串形式,还有其他更高级的类型。
  • 文档的键使用UTF-8字符。其中.$通常被保留,只有在特定环境下使用,_也是保留的。

集合是文档集,其区别于关系数据库的表。并且集合是无模式的,即不同类型的文档可以共存于同一个集合中:

{"name": "listone", "age": 22}
{"book": "The old man and the Sea"}

上面的文档是完全不同的两个文档。既然一个集合可以容纳各种类型,为何需要多集合?
使用多集合的意义在于:

  • 降低熵值。即减少混乱程度。
  • 速度上的优越性。把一个特定类型的文档分成多个子集合提高查询效率。
  • 把同种类型的文档存在一个集合汇总,使数据更集中。

Mongodb数据库操作

创建数据库

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

  • 查看所有数据库
show dbs

删除数据库

db.dropDatabase()

删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。

创建集合

db.createCollection("listone")
  • 查看已有集合
show collections
show tables

删除集合

db.collection.drop()

命令中collection替换为要删除的集合名称

插入文档

db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany(document_list)
  • 示例
>db.listone.insert({name:'listone',
    age:22
})
>db.listone.insertOne({name:'li',
    age:22
})
>db.listone.insertMany([
    {name:'stone',age:28},
    {name:'st',age:21}
])
>db.listone.find()
{ "_id" : ObjectId("5e7b83432e8c80cabc4a93c6"), "name" : "listone", "age" : 22 }
{ "_id" : ObjectId("5e7b85082e8c80cabc4a93c7"), "name" : "li", "age" : 22 }
{ "_id" : ObjectId("5e7b85592e8c80cabc4a93c8"), "name" : "stone", "age" : 28 }
{ "_id" : ObjectId("5e7b85592e8c80cabc4a93c9"), "name" : "st", "age" : 21 }

查询数据

查询所有数据

db.getCollection('listone').find({})

其中{}里面包含的是查询条件,因为是查询所有的数据,所以直接为空就行了,或者省略{}也行。

查询特定数据

db.getCollection('listone').find({"字段1":"固定值1","字段2":"固定值2"})

db.getCollection('listone').find({name:'listone'})

查询范围值数据

db.getCollection('listone').find(
     {
        "字段1":{"操作符1":边界1,"操作符2":边界2},
        "字段2":{"操作符1":边界1,"操作符2":边界2}
    }
)

db.getCollection('listone').find({age:{"$gt":22}})

和前面查询特定的数据的方法一样,只不过固定值变成了范围({"$gt":22}代表大于22)

操作符及其意义:

操作符 意义
$gt 大于(great than)
$gte 大于等于(great than equal)
$lt 小于(less than)
$lte 小于等于(less than equal)
$ne 不等于(not equal)

限定返回字段

前面的示例中都返回了所有的字段,下面我们将对某些不需要的字段进行筛选。

db.getCollection('listone').find(用于过滤的条件,用于限定的条件)
  • 去除age
db.getCollection('listone').find({age:{"$gt":22}},{"age":0})
  • 只返回age
db.getCollection('listone').find({age:{"$gt":22}},{"age":1})

大家会发现,在后面的用于限定的条件中,如果age为1,则返回了 age_id ,如果age为0,则返回了 _idname 。在不考虑_id的情况下,我们可以理解:

如果某一个字段被限定为0,则代表该字段不返回(也就是默认其它字段为1),所以其他未被限定的字段则一定会被返回

如果某一个字段被限定为1,则代表该字段返回(也就是默认其它字段为0),所以其他未被限定的字段则不会被返回

修饰返回结果

  • 得到数据的条数
db.getCollection('listone').find({}).count()
  • 限定返回结果数量
db.getCollection('test_data_1').find({}).limit(限制返回的数量)
  • 对结果进行排序
db.getCollection('test_data_1').find({}).sort({"字段名":-1或者1})

其中-1为逆序,1为正序。

修改数据

  • updateOne:只更新第一条符合条件的数据
  • updateMany:更新所有符合条件的数据

使用updateMany更新数据

db.getCollection('listone').updateMany(
    // 下面是查询条件
    { 
       "字段名1":"查找条件1","字段名2":"查找条件2"
     },
   // 进行修改
    {
        "$set":{"字段名":"新的数据","字段名":"新的数据"}
    } 
)

删除数据

  • deleteOne
  • deleteMany
db.getCollection('listone').deleteMany(
    // 删除的条件
    {
        "字段名1":"值","字段名2":"值2"
    }
)

数据去重

db.getCollection('test_data_1').distinct(去重的字段名,去重的条件)

示例:

db.getCollection('listone').distinct("name",{"age":{"$ne":22}})

这个的含义就是,在age不等于22的条件下对name字段进行去重。返回的数据是一个数组,里面是去重后的表中name字段的非重复的数据。

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

推荐阅读更多精彩内容

  • 目录 查询操作 集合查询方法 find() 查询内嵌文档 查询操作符(内含 数组查询) "$gt" 、"$gte"...
    彩虹之梦阅读 1,024评论 0 1
  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 978评论 0 2
  • NoSql数据库优缺点 在优势方面主要体现在下面几点: 简单的扩展 快速的读写 低廉的成本 灵活的数据模型 在不足...
    dreamer_lk阅读 2,735评论 0 6
  • MongoDB讲义 为0 何要学习MongoDB 灵活的数据模型 MongoDB的文档数据模型使开发人员和数...
    小虎_9f76阅读 448评论 1 3
  • 简介 MongoDB 是一个基于分布式文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WE...
    大熊_7d48阅读 37,305评论 1 9