MongoDB(二)术语与基本操作

MongoDB 术语与基本操作

MongoDB术语与关系型数据术语的对比

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

MongoDB 数据库

一个MongoDB 的实例下可以建多个数据库,不同的数据库存储在不同的文件中, 使用use <dbname>可以新建并切换到该数据库(切换数据库也使用该命令)

test> use mymongo
switched to db mymongo

一个MongoDB 的实例默认有三个数据库, 可以使用show dbs查看所有的数据库(默认进入是test数据库,新建的数据库有数据才会在显示)

test> show dbs
admin      41 kB
config    111 kB
local    73.7 kB

# admin 
# config Mongodb分片设置时,用于保存分片的相关信息
# local 不会被复制的数据库,可以存储本地

在数据库中db表示当前数据库,在shell中输入db命令会返回当前数据库的名称

test> db
test

数据库的基本操作

# 创建数据库
test> use mymongo
switched to db mymongo

# 删除数据库
mymongo> db.dropDatabase()
{ ok: 1, dropped: 'mymongo' }

# 查看数据库的版本
test> db.version()
5.0.4

# 查看当前数据库的状态
test> db.stats()
{
  db: 'test',
  collections: 0,
  views: 0,
  objects: 0,
  avgObjSize: 0,
  dataSize: 0,
  storageSize: 0,
  totalSize: 0,
  indexes: 0,
  indexSize: 0,
  scaleFactor: 1,
  fileSize: 0,
  fsUsedSize: 0,
  fsTotalSize: 0,
  ok: 1
}

# 获取shell帮助 
test> help 

# 获取数据库帮助
test> db.help()

MongoDB 集合

创建集合的基本语法: db.createCollection(name, options)

  • name: 集合名称
  • options: 可选参数

options 可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

MongoDB 集合的基本操作

# 创建集合
mymongo> db.createCollection("col01")
{ ok: 1 }

# 创建集合 带可选参数
mymongo> db.createCollection("col02",{capped: true, size: 102400, max: 100})
{ ok: 1 }

# 查看所有集合
mymongo> show collections
col01
col02

# 集合中插入数据
mymongo> db.col01.insertOne({"name":"doc01"})
{
  acknowledged: true,
  insertedId: ObjectId("61a711a16c91e78d3f263570")
}

# 删除集合
mymongo> db.col01.drop()
true

# 查看集合中的所有数据
mymongo> db.col02.find()
[ { _id: ObjectId("61a714476c91e78d3f263571"), name: 'doc02' } ]

# 查询集合中文档的总数
mymongo> db.col02.count()
DeprecationWarning: Collection.count() is deprecated. Use countDocuments or estimatedDocumentCount.
1
mymongo> db.col02.countDocuments()
1

MongoDB 文档

MongoDB 文档的数据结构是BSON 格式,和 JSON 基本一样。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

官方文档:https://docs.mongodb.com/manual/crud/

MongoDB 插入文档

插入文档的基本语法:db.COLLECTION_NAME.insert(document) 或 db.COLLECTION_NAME.save(document)

  • save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne()db.collection.replaceOne()来代替。
  • insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

注意:insert()是要过期的不建议使用,3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。

db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

参数说明:

  • document:要写入的文档。
  • writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
  • ordered:指定是否按顺序写入,默认 true,按顺序写入。

MongoDB 插入文档的基本操作:

# 插入单个文档
mymongo> db.col01.insertOne({name: "doc00"})
{
  acknowledged: true,
  insertedId: ObjectId("61a716cc6c91e78d3f263576")
}

# 批量插入文档
mymongo> db.col01.insertMany([{name: "doc01"},{name: "doc02"},{name: "doc03"}])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("61a7166f6c91e78d3f263573"),
    '1': ObjectId("61a7166f6c91e78d3f263574"),
    '2': ObjectId("61a7166f6c91e78d3f263575")
  }
}

MongoDB 更新文档

更新文档的基本语法:db.COLLECTION_NAME.update(document) 或 db.COLLECTION_NAME.save(document)

3.2 版本之后新增了 db.collection.updateOne()db.collection.updateMany()db.collection.replaceOne()

db.collection.updateOne() 用于更新一个文档,语法格式如下:

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.updateMany() 用于更新多个文档,语法格式如下:

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

<span name="udatedoc">参数说明:</span>

  • filter : 过滤条件,类似sql update查询where条件。
  • update : 应用的修改,update的字段和一些更新的操作符(如,inc...)等,可以理解为sql update查询内set后面的赋值操作。
  • upsert : 可选的参数。当为true时,updateOne()可以: 如果没有匹配筛选器的文档,则创建一个新文档。默认值为false,当没有找到匹配时不会插入新文档。。
  • writeConcern :可选的。抛出异常的级别。
  • collation : 可选的。指定操作要使用的排序规则。排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。3.4 新版功能。
  • arrayFilters: 可选的。筛选器文档的数组,它确定在数组字段的更新操作中要修改哪些数组元素。3.6 新版功能。
  • hint: 可选的。指定用于支持查询谓词的索引的文档或字符串。该选项可以接受索引规范文档或索引名称字符串。如果指定的索引不存在,则操作错误。4.2.1新版功能。

writeConcern的值:

  • WriteConcern.NONE: 没有异常抛出
  • WriteConcern.NORMAL: 仅抛出网络错误异常,没有服务器错误异常
  • WriteConcern.SAFE: 抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
  • WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
  • WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
  • WriteConcern.JOURNAL_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
  • WriteConcern.REPLICAS_SAFE: 抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。

MongoDB 更新文档的基本操作:

# 构造一些数据
db.col00.insertMany([
    {"name":"a","age":"10","status":"open"},
    {"name":"b","age":"20","status":"open"},
    {"name":"c","age":"30","status":"open"},
    {"name":"d","age":"40","status":"open"},
    {"name":"e","age":"50","status":"open"}
])

# 更新一条文档
mymongo> db.col00.updateOne( { name: "a" }, { $set: { age: "35" } })
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}


# 更新多条文档
mymongo> db.col00.updateMany( { age: { $lt: "40" } }, { $set: { status: "close" } })
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 3,
  modifiedCount: 3,
  upsertedCount: 0
}


MongoDB 删除文档

删除文档的基本语法: db.collection.remove()

3.2 版本之后新增了 db.collection.deleteOne()db.collection.deleteMany()

db.collection.deleteOne() 用于删除一个文档,语法格式如下:

db.collection.deleteOne(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>,
      hint: <document|string>        // Available starting in MongoDB 4.4
   }
)

db.collection.deleteMany() 用于删除多个文档,语法格式如下:

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

参数解释见MongoDB 更新文档的参数解释

MongoDB 删除文档的基本操作

# 删除一条文档
mymongo>  db.col00.deleteOne({name: "a"})
{ acknowledged: true, deletedCount: 1 }

# 删除多条文档
mymongo> db.col00.deleteMany({ age: { $lt: "40" } })
{ acknowledged: true, deletedCount: 2 }

# 删除所有文档
db.col00.deleteMany({})

MongoDB 查询文档

官方文档:https://docs.mongodb.com/manual/tutorial/query-documents/

查询文档的基本语法:db.collection.find(query, projection)

参数解释:

  • query:可选的。使用查询操作符指定选择筛选器。若要返回集合中的所有文档,请忽略此参数或传递一个空文档({})。
  • projection:可选的。指定要在文档中返回的与查询筛选器匹配的字段。若要返回匹配文档中的所有字段,请忽略此参数

查询文档基本操作

# 查询所有的文档
mymongo> db.col00.find()
[
{_id:ObjectId("61a729ff254f0000c90068ed"),name:'a',age:'10',status:'open'},{_id:ObjectId("61a729ff254f0000c90068ee"),name:'b',age:'20',status:'open'},{_id:ObjectId("61a729ff254f0000c90068ef"),name:'c',age:'30',status:'open'},{_id:ObjectId("61a729ff254f0000c90068f0"),name:'d',age:'40',status:'open'},{_id:ObjectId("61a729ff254f0000c90068f1"),name:'e',age:'50',status:'open'}
]

# 条件查询
mymongo> db.col00.find({age: '40'})
[
{_id:ObjectId("61a729ff254f0000c90068f0"),name:'d',age:'40',status:'open'}
]

# 指定返回字段
mymongo> db.col00.find({age: '40'}, {name: 1, _id: 0})
[ { name: 'd' } ]

mymongo> db.col00.find({age: '40'}, {name: true, _id: false})
[ { name: 'd' } ]

# 查询返回指定条数
mymongo> db.col00.find({}, {name: true, _id: false}).limit(3)
[ { name: 'a' }, { name: 'b' }, { name: 'c' } ]

# 查询并排序
mymongo> db.col00.find({}, {name: true, _id: false}).sort({name: 1})
[
  { name: 'a' },
  { name: 'b' },
  { name: 'c' },
  { name: 'd' },
  { name: 'e' }
]
# 倒序
mymongo> db.col00.find({}, {name: true, _id: false}).sort({name: -1})
[
  { name: 'e' },
  { name: 'd' },
  { name: 'c' },
  { name: 'b' },
  { name: 'a' }
]

MongoDB 与 RDBMS Where 语句比较

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

推荐阅读更多精彩内容