为了更好的理解,下面与SQL中的概念进行对比:
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
| database | 数据库 | |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |

- #查看所有的数据库
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
-
- #通过use关键字切换数据库
- > use admin
- switched to db admin
-
- #创建数据库
- #说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
- > use testdb
- switched to db testdb
- > show dbs #并没有创建数据库
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- > db.user.insert({id:1,name:'zhangsan'}) #插入数据
- WriteResult({ "nInserted" : 1 })
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- testdb 0.000GB #数据库自动创建
-
- #查看表
- > show tables
- user
- > show collections
- user
- >
-
- #删除集合(表)
- > db.user.drop()
- true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
-
- #删除数据库
- > use testdb #先切换到要删除的数据库中
- switched to db testdb
- > db.dropDatabase() #删除数据库
- { "dropped" : "testdb", "ok" : 1 }
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。
- #插入数据
-
- #语法:db.COLLECTION_NAME.insert(document)
- > db.user.insert({id:1,username:'zhangsan',age:20})
- WriteResult({ "nInserted" : 1 })
-
- > db.user.save({id:2,username:'lisi',age:25})
- WriteResult({ "nInserted" : 1 })
-
- > db.user.find() #查询数据
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 20 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
update() 方法用于更新已存在的文档。语法格式如下:
- db.collection.update(
- <query>,
- <update>,
- [
- upsert: <boolean>,
- multi: <boolean>,
- writeConcern: <document>
- ]
- )
参数说明:
示例:
- > db.user.find()
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 20 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
-
- > db.user.update({id:1},{$set:{age:22}}) #更新数据
-
- WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
-
- > db.user.find()
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 22 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
-
- #注意:如果这样写,会删除掉其他的字段
- > db.user.update({id:1},{age:25})
- WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
- > db.user.find()
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
-
- #更新不存在的字段,会新增字段
- > db.user.update({id:2},{$set:{sex:1}}) #更新数据
- > db.user.find()
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
-
- #更新不存在的数据,默认不会新增数据
- > db.user.update({id:3},{$set:{sex:1}})
- WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
- > db.user.find()
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
-
- #如果设置第一个参数为true,就是新增数据
- > db.user.update({id:3},{$set:{sex:1}},true)
- WriteResult({
- "nMatched" : 0,
- "nUpserted" : 1,
- "nModified" : 0,
- "_id" : ObjectId("5c08cb281418d073246bc642")
- })
- > db.user.find()
- { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
- { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
- { "_id" : ObjectId("5c08cb281418d073246bc642"), "id" : 3, "sex" : 1 }
通过remove()方法进行删除数据,语法如下:
- db.collection.remove(
- <query>,
- {
- justOne: <boolean>,
- writeConcern: <document>
- }
- )
参数说明:
删除数据示例:
- > db.user.remove({age:25})
- WriteResult({ "nRemoved" : 2 }) #删除了2条数据
-
- #插入4条测试数据
- db.user.insert({id:1,username:'zhangsan',age:20})
- db.user.insert({id:2,username:'lisi',age:21})
- db.user.insert({id:3,username:'wangwu',age:22})
- db.user.insert({id:4,username:'zhaoliu',age:22})
-
- > db.user.remove({age:22},true)
- WriteResult({ "nRemoved" : 1 }) #删除了1条数据
-
- #删除所有数据
- > db.user.remove({})
-
- #说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作。
- db.user.deleteOne({id:1})
- db.user.deleteMany({}) #删除所有数据
MongoDB 查询数据的语法格式为:db.user.find([query],[fields])
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式为:db.col.find().pretty()
条件查询:
| 操作 | 格式 | 范例 | RDBMS中的类似语句 |
| 等于 | { | db.col.find({"by":"黑马程序员"}).pretty() | where by = '黑马程序员' |
| 小于 | { | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | { | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | { | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | { | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | { | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
- #插入测试数据
- db.user.insert({id:1,username:'zhangsan',age:20})
- db.user.insert({id:2,username:'lisi',age:21})
- db.user.insert({id:3,username:'wangwu',age:22})
- db.user.insert({id:4,username:'zhaoliu',age:22})
-
- db.user.find() #查询全部数据
- db.user.find({},{id:1,username:1}) #只查询id与username字段
- db.user.find().count() #查询数据条数
- db.user.find({id:1}) #查询id为1的数据
- db.user.find({age:{$lte:21}}) #查询小于等于21的数据
- db.user.find({age:{$lte:21}, id:{$gte:2}}) #and查询,age小于等于21并且id大于等于2
- db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2
-
- #分页查询:Skip()跳过几条,limit()查询条数
- db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据
- db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
MongoDB支持的索引类型有:
重点需要掌握的是【单字段索引】、【2dsphere索引】。
示例:
- #单字段索引,1表示升序创建索引,-1表示降序创建索引
- db.集合名.createIndex({"字段名":排序方式})
-
- #示例,创建user集合,其中username字段设置索引
- db.user.createIndex({"username":1})
-
- db.user.insert({id:1,username:'zhangsan',age:20})
- db.user.insert({id:2,username:'lisi',age:22})
-
- #查看索引
- db.user.getIndexes()
- #查看索引大小,单位:字节
- db.user.totalIndexSize()
-
- #删除索引
- db.user.dropIndex("username_1")
- #或者,删除除了_id之外的索引
- db.user.dropIndexes()
MongoDB地理空间索引类型有:
示例:
- #2dsphere索引
- db.集合名.createIndex({"字段名":"2dsphere"})
-
- #示例,创建user集合,其中loc字段设置索引
- db.user.createIndex({"loc":"2dsphere"})
-
- db.user.insert({id:3,username:'wangwu',age:21,loc:{type:"Point",coordinates:[116.343847,40.060539]}})
- db.user.insert({id:4,username:'zhaoliu',age:23,loc:{type:"Point",coordinates:[121.612112,31.034633]}})
-
- #多边形索引类型示例
- #为scpoe集合中的scpoe字段设置球面索引
- db.scope.createIndex({"scpoe":"2dsphere"})
-
- #为了便于理解,这里采用x、y坐标系的值来模拟快递员的作业范围
- #coordinates格式必须是:[ [ [x,y],[x,y],[x,y] ] ]
- db.scope.insert({
- id: 1,
- username: 'shkdy',
- scpoe: {
- type: "Polygon",
- coordinates: [
- [
- [0,0],
- [3,0],
- [3,3],
- [0,3],
- [0,0]
- ]
- ]
- }
- })
-
- db.scope.insert({
- id: 2,
- username: 'bjkdy',
- scpoe: {
- type: "Polygon",
- coordinates: [
- [
- [- 3, 3],
- [3, 3],
- [3, - 3],
- [- 3, - 3],
- [- 3, 3]
- ]
- ]
- }
- })
-
- #假设,现在有坐标点[-1,-1]用户下单,就需要查询到所在服务范围内的快递员
- #$geoIntersects 查询与指定的几何图形(这里用的是点)相交的数据
- #$geometry 指定几何图形
- db.scope.find({
- scpoe: {
- $geoIntersects: {
- $geometry: {
- type: "Point",
- coordinates: [-1, -1]
- }
- }
- }
- })
- #显然,只能查询到【bjkdy】
- #如何坐标点改为[1,1],就可以查询到这两个快递员
- db.scope.find({
- scpoe: {
- $geoIntersects: {
- $geometry: {
- type: "Point",
- coordinates: [1, 1]
- }
- }
- }
- })

前面我们是通过命令行操作MongoDB,这样不太方便,可以通过可视化工具操作MongoDB,在这里推荐使用Studio 3T。
官网: The Ultimate Client, IDE and GUI for MongoDB | Studio 3T

下载地址:Download Studio 3T for MongoDB | Windows, macOS & Linux
Studio 3T提供了30天的试用期,时期用到后可以永久使用免费版,免费版比收费版功能要少一些,对我们而言免费版也够用了。
Studio 3T需要注册账号,自主注册即可。


查看json结构数据:
