MongoDB-基础使用(一)

零、本文纲要

一、MongoDB相关概念

  1. 应用场景
  2. 体系结构
  3. 数据模型

二、使用MongoDB

  1. 安装MongoDB
  2. 常用命令
    ① 数据库操作
    ② 集合操作(对应数据库表操作)
    ③ 文档操作(相当于数据库CRUD)
    Ⅰ 插入数据
    Ⅱ 查询操作
    Ⅲ 更新操作
    Ⅳ 删除操作
    ④ 文档操作(其他常用查询)
    Ⅰ 统计操作
    Ⅱ 分页操作
    Ⅲ 排序操作
    Ⅳ 模糊查询(正则查询)
    Ⅴ 比较查询
    Ⅵ 包含查询
    Ⅶ 条件连接查询
    ⑤ 操作小结

一、MongoDB相关概念

1. 应用场景

① 数据量大;
② 写入操作频繁(读写都很频繁);
③ 价值较低的数据,对事务性要求不高;

2. 体系结构

SQL术语/概念 MongoDB术语/概念 解释说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins / 表连接,MongoDB不支持
/ 嵌入文档 MongoDB通过嵌入式文档来替代多表连接
primary key primary key 主键,MongoDB自动将_id字段设置为主键

3. 数据模型

MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。
数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。

Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object;
mongo还使用了特殊的数据类型,包括:date,object id,binary data,regular expression 和code。

常见数据类型

数据类型 描述 举例
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 {"x" : "foobar"}
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 shell是不支持该类型的,
shell中默认会转换成64位浮点数
Boolean 布尔值。用于存储布尔值(真/假)。 {"x":true}+
Double 双精度浮点值。用于存储浮点值。 {"x":3.14159,"y":3}
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。 {"x" : ["a", "b", "c"]}
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。 {"x":null}
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。 {"X" :ObjectId() }
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。 {"x" : function() { /* …… */ }}
Regular expression 正则表达式类型。用于存储正则表达式。 {"x" : /foobar/i}

二、使用MongoDB

1. 安装MongoDB

下载MongoDB

下载MongoDB.png

① 解压至指定目录

tar -zxvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local

② 准备数据目录

cd mongodb-linux-x86_64-4.0.10/

mkdir -p single/data/db
mkdir -p single/log

③ 编写配置文件

touch single/mongodb.conf
systemLog:
    #MongoDB发送所有日志输出的目标指定为文件
    # #The path of the log file to which mongod or mongos should send all diagnostic logging information
    destination: file
    #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
    path: "/usr/local/mongodb-linux-x86_64-4.0.10/single/log/mongod.log"
    #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
    logAppend: true
storage:
    #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
    ##The directory where the mongod instance stores its data.Default Value is "/data/db".
    dbPath: "/usr/local/mongodb-linux-x86_64-4.0.10/single/data/db"
    journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
        enabled: true
processManagement:
    #启用在后台运行mongos或mongod进程的守护进程模式。
    fork: true
net:
    #服务实例绑定的IP,默认是localhost
    bindIp: localhost,192.168.253.128
    #bindIp
    #绑定的端口,默认是27017
    port: 27017

④ 启动MongoDB服务

bin/mongod -f single/mongodb.conf

查看进程启动情况:ps -ef | grep mongod

⑤ 关闭MongoDB服务

标准的关闭方法需要连接至其客户端进行关闭,如下:

bin/mongo --port 27017
use admin
db.shutdownServer()

如果遇到数据损坏:

rm -f single/data/db/*.lock
bin/mongod --repair --dbpath=single/data/db

2. 常用命令

MongoDB官方文档,这个网址不稳定,需要飞机。

首先登录其client端bin/mongo --port 27017,此处也可以使用其他数据库客户端直接连接,如:DataGrip。

① 数据库操作

# 创建数据库
use [database_name]
#如:
use db_test

# 查看当前权限的所有数据库
show databases
show dbs

# 查看当前正在使用的数据库
db

# 删除数据库,删除当前数据库
db.dropDatabase()

② 集合操作(对应数据库表操作)

# 显示创建(了解)
db.createCollection(["collection_name"])
#如:
db.createCollection("collection_test")

#查看当前库中的集合(对应数据库的表)
show collections
show tables

# 删除集合
db.collection.drop()
db.[collection_name].drop()
#如:
db.collection_test.drop()

③ 文档操作(相当于数据库CRUD)

Ⅰ 插入数据

注意:此处插入的数据后续会持续用到,如果后续数据不足可以重新插入几个。

# 单个文档插入
db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)
#如:
db.collection_test.insertOne(
    {
        "articleid":"100000",
        "content":"今天天气真好,阳光明媚",
        "userid":"1001",
        "nickname":"Rose",
        "createdatetime":new Date(),
        "likenum":NumberInt(10),
        "state":null
    }
)

# 批量插入
db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)
#如:
db.collection_test.insertMany([
    {
        "_id":"1",
        "articleid":"100001",
        "content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。",
        "userid":"1002",
        "nickname":"相忘于江湖",
        "createdatetime":new Date("2019-08-05T22:08:15.522Z"),
        "likenum":NumberInt(1000),
        "state":"1"
    },
    {
        "_id":"2",
        "articleid":"100001",
        "content":"我夏天空腹喝凉开水,冬天喝温开水",
        "userid":"1005",
        "nickname":"伊人憔悴",
        "createdatetime":new Date("2019-08-05T23:58:51.485Z"),
        "likenum":NumberInt(888),
        "state":"1"
    }
]);

参数说明:
document:要写入的文档;
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求;
ordered:指定是否按顺序写入,默认 true,按顺序写入。
一般我们都只写<document>,writeConcern 与 ordered 使用默认值即可。

Ⅱ 查询操作

# 查询所有
db.[collection_name].find()
db.[collection_name].find({})
#如:
db.collection_test.find();

# 条件查询
db.[collection_name].find(
    {
        [field_name]: [field_value]
    }
)
#如:
db.collection_test.find({articleid: "100000"})
db.collection_test.find({articleid: "100001", likenum: 888})

# 投影查询:指定显示与不显示的字段
db.[collection_name].find(
    {
        [field_name]: [field_value]
    },
    {
        [field_name]: 1, #显示
        [field_name]: 0  #不显示
    }
)
#如:
db.collection_test.find(
    {articleid: "100001", likenum: 888},
    {_id: 0, articleid: 1, likenum: 1}
)
查询全部.png

Ⅲ 更新操作

# 单个更新操作
db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)
#如:
db.collection_test.updateOne(
    {articleid: "100000"},
    {$set:{likenum:NumberInt(99)}}
)

# 批量更新
db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)
#如:
db.collection_test.updateMany(
    {articleid: "100001"},
    {$set:{likenum:NumberInt(99)}}
)

# 列值增长 $inc
db.collection_test.updateMany(
    {_id: "2"},
    {$inc:{likenum:NumberInt(1)}}
)

参数说明:
filter : update的查询条件,类似sql update查询内where后面的;
update : update的对象和一些更新的操作符(如,inc...)等,也可以理解为sql update查询内set后面的;
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
writeConcern:可选,抛出异常的级别;
collation : 可选,指定 用于操作的排序规则;
arrayFilters :可选,筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素;
hint:可选,指定用于支持查询谓词的索引的文档或字符串,4.2.1版本开始可用。
一般我们也不通过语句直接使用这些参数。

Ⅳ 删除操作

# 删除单个
db.collection.deleteOne(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)
#如:
db.collection_test.deleteOne(
    {likenum: NumberInt(100)}
)

# 删除多个
db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)
#如:
db.collection_test.deleteMany(
    {likenum: NumberInt(99)}
)
# 删表跑路
db.collection_test.deleteMany({})

④ 文档操作(其他常用查询)

Ⅰ 统计操作

与4.0功能兼容的MongoDB驱动程序弃用各自的光标和收集count()的API,取而代之的是新的API countDocuments()和estimatedDocumentCount()。
此处,count()的功能我们会通过新的API实现。

# 统计操作(类似数据库聚合查询)
db.collection.countDocuments( <query>, <options> )
#如:
db.collection_test.countDocuments({}) #统计文档记录数
db.collection_test.countDocuments( #统计likenum为888的记录数
    {likenum: NumberInt(888)}
)

# 不含过滤规则的统计
db.collection.estimatedDocumentCount( <options> )
#如:
db.collection_test.estimatedDocumentCount({})

options参数说明
limit 整数 可选 要计算的最大文件数。
skip 整数 可选 计数前要跳过的文档数。
hint 字符串或文件 可选 用于查询的索引名称或索引规范。
maxTimeMS 整数 可选的 允许计数运行的最长时间。

避免使用db.collection.count()没有查询谓词的方法,因为如果没有查询谓词,该方法将基于集合的元数据返回结果,这可能会导致近似计数。
特别是:
a、在分片群集上,结果计数将无法正确过滤出孤立的文档;
b、不正常关机后,计数可能不正确。

Ⅱ 分页操作

# 分页查询
db.collection.find().limit(NUMBER).skip(NUMBER)
#如:
db.collection_test.find().limit(2).skip(2)

Ⅲ 排序操作

# 排序操作
db.collection.find().sort(
    {
        field_name: 1,  #1表示升序
        field_name: -1  #-1表示降序
    }
)
#如:
db.collection_test.find().sort(
    {
        state: 1,
        likenum: -1
    }
)

Ⅳ 模糊查询(正则查询)

# 正则查询
db.collection.find({field_name:/正则表达式/})
#如:
db.collection_test.find(
    {nickname: /江湖/}
)

Ⅴ 比较查询

# 比较查询
db.collection.find({ field_name : { $gt: value }}) // 大于: field > value
db.collection.find({ field_name : { $lt: value }}) // 小于: field < value
db.collection.find({ field_name : { $gte: value }}) // 大于等于: field >= value
db.collection.find({ field_name : { $lte: value }}) // 小于等于: field <= value
db.collection.find({ field_name : { $ne: value }}) // 不等于: field != value
#如:
db.collection_test.find(
    {likenum: {$gt: NumberInt(999)}}
)

Ⅵ 包含查询

# 包含查询
db.collection.find({ field_name : { $in:[ value1, value2]}})
db.collection.find({ field_name : { $nin:[ value1, value2]}})
#如:
db.collection_test.find(
    {likenum: {$in: [NumberInt(888), NumberInt(1000)]}}
)

Ⅶ 条件连接查询

# and连接
db.collection.find({ $and:[{}, {}] })
#如:
db.collection_test.find({
    $and: [
        {likenum: {$gte: NumberInt(900)}},
        {likenum: {$lte: NumberInt(1000)}}
    ]
})

# or连接
db.collection.find({ $or:[{}, {}] })
#如:
db.collection_test.find({
    $or: [
        {likenum: {$lte: NumberInt(900)}},
        {likenum: {$gte: NumberInt(950)}}
    ]
})

⑤ 操作小结

1. 选择切换数据库:use collection

2. 插入数据:db.collection.insert({bson数据})

3. 查询所有数据:db.collection.find()

4. 条件查询数据:db.collection.find({条件})

5. 查询符合条件的第一条记录:db.collection.findOne({条件})

6. 查询符合条件的前几条记录:db.collection.find({条件}).limit(条数)

7. 查询符合条件的跳过的记录:db.collection.find({条件}).skip(条数)

8. 修改数据:db.collection.updateOne({条件},{修改后的数据}) 
或 db.collection.updateOne({条件},{$set:{要修改部分的字段:数据})
或 db.collection.updateMany({条件},{修改后的数据}) 

9. 修改数据并自增某字段值:db.collection.updateOne({条件},{$inc:{自增的字段:步进值}})

10. 删除数据:db.collection.deleteOne({条件})
或 db.collection.deleteMany({条件})

11. 统计查询:db.collection.count({条件})
或 db.collection.countDocuments({条件})
或 db.collection.estimatedDocumentCount()

12. 模糊查询:db.collection.find({字段名:/正则表达式/})

13. 条件比较运算:db.collection.find({字段名:{$gt:值}})

14. 包含查询:db.collection.find({字段名:{$in:[值1,值2]}})
或 db.collection.find({字段名:{$nin:[值1,值2]}})

15. 条件连接查询:db.collection.find({$and:[{条件1},{条件2}]})
或 db.collection.find({$or:[{条件1},{条件2}]})

三、结尾

以上即为MongoDB-基础使用(一)的全部内容,感谢阅读。

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

推荐阅读更多精彩内容