MongoDB 基本使用

tech2022-09-03  116

MongoDB 概念

SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB 不支持primary keyprimary key主键,MongoDB 将 _id 字段设置为主键

数据库(Database)

一个 MongoDB 实例可以建立多个数据库。默认数据库名为 db,该数据库在 data 目录下

特殊数据库

adminlocalconfig

文档(Document)

文档是一组类似于 JSON 的键值对(BSON),不需要有相同的字段,也不需要字段有相同的类型

BSON:二进制的 JSON,相较于 JSON,BSON 的值是有数据类型的,而不是单一的字符串

数据类型:String、Integer、Boolean、Double、Min/Max keys、Array、Timestamp、Object、Null、Symbol、Date、Object ID(主键)、Binary Date、Code( JS 代码)、RE(正则表达式)

键值对是有序的。键是字符串,值有自己的数据类型,而不单纯是字符串区分类型和大小写

文档命名规则如下:

文档不能有重复的主键(_id)键不能含有 \0,因为这代表字符串的结尾.、 $ 有特殊的意义,_ 开头的键是保留的

集合(Collections)

集合就是一组文档,集合内的文档不要求结构一样

集合命名规则如下:

不能是空字符串 ""。

不能含有 \0 字符

不能以 system.开头,这是为系统集合保留的前缀

Capped Collection 追加的集合,大小要提前设置且是固定的,索引顺序也就是插入顺序,而且在磁盘上也是追加写的,意味着只能删除最后一条数据,或清空集合

元数据(MetaData)

保存了数据库各种信息的集合

集合命名空间描述dbname.system.namespaces列出所有名字空间dbname.system.indexes列出所有索引dbname.system.profile包含数据库概要信息dbname.system.users列出所有可访问数据库的用户dbname.local.sources包含复制对端的服务器信息和状态

基本操作

mongod:MongoDB 的服务端

mongo:MongoDB 的客户端

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

数据库操作

use test1 # 使用数据库,若数据库不存在则创建 show dbs # 查看所有存在的数据库 db # 显示当前数据库 db.dropDatabase() # 删除当前的数据库

集合操作

# 可选参数 capped 是否为追加集合,size 集合的大小,max 最大的文档数量 db.createCollection("col1",{capped: true, size: 6142800, max: 1000}) show collations # 查看存在的集合 db.col2.insert({name: "zhangsan"}) # 在一个不存在的集合插入数据也会创建 db.col2.drop() # 删除集合

文档操作

查到数据才能改和删,所以查的乱七八糟的操作,也能作用于改与删上

db.col2.find() # 查看 col2 集合中所有文档 db.col2.find().limit(2) # 查看前两条数据 db.col2.find().skip(2) # 跳过前两条数据 db.col2.find().pretty # 以易读的方式展示 db.col2.find().sort({age: 1}) # 按照指定字段排序,1 升序,-1 降序 # g: great 大于 l: little 小于 e: euals 等于 n: not 不等于 db.col2.find({age: 18}) # 相当于 where age = 18 db.col2.find({age: {$lt: 18}}) # 相当于 where age < 18 db.col2.find({age: {$lte: 18}}) # 相当于 where age <= 18 db.col2.find({age: {$gt: 18}}) # 相当于 where age > 18 db.col2.find({age: {$gte: 18}}) # 相当于 where age >= 18 db.col2.find({age: {$ne: 18}}) # 相当于 where age != 18 # 与或 db.col2.find({name: "zhangsan", age: 18}) # 相当于 where name = "zhangsan" and age =18 db.col2.find({$or: [{name: "zhangsan"}, {name: "lisi"}]}) # 相当于 where name = "zhangsan" or name = "lisi" # 支持正则表达式 db.col2.find({name: /^w/}) # 根据类型 db.col2.find({name: {$type: "string"}})

db.col2.insert({name: "zhangsan"}) # 在 col2 集合中插入一个文档 db.col2.insertOne({name: "lisi"}) # 在 col2 集合中插入一个文档 db.col2.insertMany([ {name: 'wangwu'},{name: 'maliu'} ]) # 在 col2 集合中插入多个文档

db.col2.remove({name: "lisi"}) # 删除找到的文档,默认删除多条 db.col2.remove({name: "wangsan"},{justOne: true}) # 删除一条

db.col2.update({name: "zhangsan"},{$set: {name: "wangsan"}}) # 更新找到的文档,默认更新一条 db.col2.update({name: "zhangsan"},{$set: {name: "wangsan"}},{multi: true}) # 更新多条 db.col2.save({_id: ObjectId("5f4fd299ed329eb546375c10"), name: "zhaosi"}) # _id 存在则替换原有文档,若不存在则插入一条文档

索引操作

db.col2.createIndex({name: 1}) # 给 name 创建一条索引,1 升序 -1 降序 db.col2.createIndex({name: 1, age: -1}) # 创建一条复合索引 # 可选参数 background 是否在后台创建索引,unique 是否为唯一索引,weights 该索引的权重 db.col2.createIndex({name: 1}, {background: true, unique: true, weights: 1})

后台创建索引,不会阻塞其他数据库操作

聚合

# 返回的文档字段选择,1 为要返回,默认 _id 是 1 db.col2.aggregate({$project: {name: 1}}) # 相当于 where age > 18 and age < 26 db.col2.aggregate({$match: {age: {$gt: 18, $lt: 26}}}) # 过滤前五条 db.col2.aggregate({$skip: 5}) # 排序 db.col2.aggregate({$sort: {age: -1}}) # 限制文档数 db.col2.aggregate({$limit: 10) # 根据指定字段分组(不指定不分组),然后再运算,指定的字段前要加 $ # sum 总计,max 最大值,min 最小值,avg 平均值 db.col2.aggregate({$group: {_id: "$age", 总计: {$sum: 1}}}) db.col2.aggregate({$group: {_id: "$name", 最大值: {$max: "$age"}}}) db.col2.aggregate({$group: {_id: "$name", 最小值: {$min: "$age"}}}) db.col2.aggregate({$group: {_id: "$name", 平均值: {$avg: "$age"}}}) # push 添加到可重复数组,addToSet 添加到不重复的集合 db.col2.aggregate({$group: {_id: "$name", 数组: {$push: "$age"}}}) db.col2.aggregate({$group: {_id: "$name", 数组: {$push: {年龄: "$age", 姓名: "$name"}}}}) db.col2.aggregate({$group: {_id: "$name", 数组: {$addToSet: "$age"}}}) db.col2.aggregate({$group: {_id: "$name", 数组: {$addToSet: {年龄: "$age", 姓名: "$name"}}}}) # first 返回每组第一个文档的指定字段,last 返回每组最后一个文档的指定字段 db.col2.aggregate({$group: {_id: "$name", 第一个: {$first: "$age"}}}) db.col2.aggregate({$group: {_id: "$name", 第一个: {$first: {年龄: "$age", 姓名: "$name"}}}}) db.col2.aggregate({$group: {_id: "$name", 最后一个: {$last: "$age"}}}) db.col2.aggregate({$group: {_id: "$name", 第一个: {$last: {年龄: "$age", 姓名: "$name"}}}}) # 各种乱七八糟的复合 db.col2.aggregate([ {$match: {age: {$gt: 18, $lt: 26}}}, {$project: {age: 1}}, {$skip: 5}, {$sort: {age: -1}}, {$limit: 10}, {$group: {_id: "$age", 总计: {$sum: 1}}} ])
最新回复(0)