• MongoDB基本操作


    一、基本概念

    为了更好的理解,下面与SQL中的概念进行对比:

    SQL术语/概念

    MongoDB术语/概念

    解释/说明

    database

    database

    数据库

    table

    collection

    数据库表/集合

    row

    document

    数据记录行/文档

    column

    field

    数据字段/域

    index

    index

    索引

    table joins

    表连接,MongoDB不支持

    primary key

    primary key

    主键,MongoDB自动将_id字段设置为主键

     二、MongoDB基本操作

    2.1.数据库以及表的操作

    1. #查看所有的数据库
    2. > show dbs
    3. admin 0.000GB
    4. config 0.000GB
    5. local 0.000GB
    6. #通过use关键字切换数据库
    7. > use admin
    8. switched to db admin
    9. #创建数据库
    10. #说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
    11. > use testdb
    12. switched to db testdb
    13. > show dbs #并没有创建数据库
    14. admin 0.000GB
    15. config 0.000GB
    16. local 0.000GB
    17. > db.user.insert({id:1,name:'zhangsan'}) #插入数据
    18. WriteResult({ "nInserted" : 1 })
    19. > show dbs
    20. admin 0.000GB
    21. config 0.000GB
    22. local 0.000GB
    23. testdb 0.000GB #数据库自动创建
    24. #查看表
    25. > show tables
    26. user
    27. > show collections
    28. user
    29. >
    30. #删除集合(表)
    31. > db.user.drop()
    32. true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false
    33. #删除数据库
    34. > use testdb #先切换到要删除的数据库中
    35. switched to db testdb
    36. > db.dropDatabase() #删除数据库
    37. { "dropped" : "testdb", "ok" : 1 }
    38. > show dbs
    39. admin 0.000GB
    40. config 0.000GB
    41. local 0.000GB

     2.2.新增数据

    在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。 

    1. #插入数据
    2. #语法:db.COLLECTION_NAME.insert(document)
    3. > db.user.insert({id:1,username:'zhangsan',age:20})
    4. WriteResult({ "nInserted" : 1 })
    5. > db.user.save({id:2,username:'lisi',age:25})
    6. WriteResult({ "nInserted" : 1 })
    7. > db.user.find() #查询数据
    8. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 20 }
    9. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
    • _id 是集合中文档的主键,用于区分文档(记录),_id自动编入索引。
    • 默认情况下,_id 字段的类型为 ObjectID,是 MongoDB 的 BSON 类型之一,如果需要,用户还可以将 _id 覆盖为 ObjectID 以外的其他内容。
    • ObjectID 长度为 12 字节,由几个 2-4 字节的链组成。每个链代表并指定文档身份的具体内容。以下的值构成了完整的 12 字节组合:
      • 一个 4 字节的值,表示自 Unix 纪元以来的秒数
      • 一个 3 字节的机器标识符
      • 一个 2 字节的进程 ID
      • 一个 3字节的计数器,以随机值开始

     2.3.更新数据

     update() 方法用于更新已存在的文档。语法格式如下:

    1. db.collection.update(
    2. <query>,
    3. <update>,
    4. [
    5. upsert: <boolean>,
    6. multi: <boolean>,
    7. writeConcern: <document>
    8. ]
    9. )

    参数说明:

    • query : update的查询条件,类似sql update查询内where后面的。
    • update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern :可选,抛出异常的级别。

    示例: 

    1. > db.user.find()
    2. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 20 }
    3. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
    4. > db.user.update({id:1},{$set:{age:22}}) #更新数据
    5. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    6. > db.user.find()
    7. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "id" : 1, "username" : "zhangsan", "age" : 22 }
    8. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
    9. #注意:如果这样写,会删除掉其他的字段
    10. > db.user.update({id:1},{age:25})
    11. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    12. > db.user.find()
    13. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
    14. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25 }
    15. #更新不存在的字段,会新增字段
    16. > db.user.update({id:2},{$set:{sex:1}}) #更新数据
    17. > db.user.find()
    18. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
    19. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
    20. #更新不存在的数据,默认不会新增数据
    21. > db.user.update({id:3},{$set:{sex:1}})
    22. WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
    23. > db.user.find()
    24. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
    25. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
    26. #如果设置第一个参数为true,就是新增数据
    27. > db.user.update({id:3},{$set:{sex:1}},true)
    28. WriteResult({
    29. "nMatched" : 0,
    30. "nUpserted" : 1,
    31. "nModified" : 0,
    32. "_id" : ObjectId("5c08cb281418d073246bc642")
    33. })
    34. > db.user.find()
    35. { "_id" : ObjectId("5c08c0024b318926e0c1f6dc"), "age" : 25 }
    36. { "_id" : ObjectId("5c08c0134b318926e0c1f6dd"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
    37. { "_id" : ObjectId("5c08cb281418d073246bc642"), "id" : 3, "sex" : 1 }

     2.4.删除数据

    通过remove()方法进行删除数据,语法如下:

    1. db.collection.remove(
    2. <query>,
    3. {
    4. justOne: <boolean>,
    5. writeConcern: <document>
    6. }
    7. )

    参数说明:

    • query :(可选)删除的文档的条件。
    • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
    • writeConcern :(可选)抛出异常的级别。

    删除数据示例:

    1. > db.user.remove({age:25})
    2. WriteResult({ "nRemoved" : 2 }) #删除了2条数据
    3. #插入4条测试数据
    4. db.user.insert({id:1,username:'zhangsan',age:20})
    5. db.user.insert({id:2,username:'lisi',age:21})
    6. db.user.insert({id:3,username:'wangwu',age:22})
    7. db.user.insert({id:4,username:'zhaoliu',age:22})
    8. > db.user.remove({age:22},true)
    9. WriteResult({ "nRemoved" : 1 }) #删除了1条数据
    10. #删除所有数据
    11. > db.user.remove({})
    12. #说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作。
    13. db.user.deleteOne({id:1})
    14. db.user.deleteMany({}) #删除所有数据

     2.5.查询数据

    MongoDB 查询数据的语法格式为:db.user.find([query],[fields])

    • query :可选,使用查询操作符指定查询条件
    • fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

    如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式为:db.col.find().pretty()

    条件查询:

    操作

    格式

    范例

    RDBMS中的类似语句

    等于

    {:}

    db.col.find({"by":"黑马程序员"}).pretty()

    where by = '黑马程序员'

    小于

    {:{$lt:}}

    db.col.find({"likes":{$lt:50}}).pretty()

    where likes < 50

    小于或等于

    {:{$lte:}}

    db.col.find({"likes":{$lte:50}}).pretty()

    where likes <= 50

    大于

    {:{$gt:}}

    db.col.find({"likes":{$gt:50}}).pretty()

    where likes > 50

    大于或等于

    {:{$gte:}}

    db.col.find({"likes":{$gte:50}}).pretty()

    where likes >= 50

    不等于

    {:{$ne:}}

    db.col.find({"likes":{$ne:50}}).pretty()

    where likes != 50

    1. #插入测试数据
    2. db.user.insert({id:1,username:'zhangsan',age:20})
    3. db.user.insert({id:2,username:'lisi',age:21})
    4. db.user.insert({id:3,username:'wangwu',age:22})
    5. db.user.insert({id:4,username:'zhaoliu',age:22})
    6. db.user.find() #查询全部数据
    7. db.user.find({},{id:1,username:1}) #只查询id与username字段
    8. db.user.find().count() #查询数据条数
    9. db.user.find({id:1}) #查询id为1的数据
    10. db.user.find({age:{$lte:21}}) #查询小于等于21的数据
    11. db.user.find({age:{$lte:21}, id:{$gte:2}}) #and查询,age小于等于21并且id大于等于2
    12. db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2
    13. #分页查询:Skip()跳过几条,limit()查询条数
    14. db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据
    15. db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序

     三、索引

    索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

    MongoDB支持的索引类型有:

    • 单字段索引(Single Field)
      • 支持所有数据类型中的单个字段索引
    • 复合索引(Compound Index)
      • 基于多个字段的索引,创建复合索引时要注意字段顺序与索引方向
    • 多键索引(Multikey indexes)
      • 针对属性包含数组数据的情况,MongoDB支持针对数组中每一个element创建索引。
    • 全文索引(Text Index)
      • 支持任意属性值为string或string数组元素的索引查询。
      • 注意:一个集合仅支持最多一个Text Index,中文分词不理想,推荐Elasticsearch。
    • 地理空间索引(Geospatial Index)
      • 2dsphere索引,用于存储和查找球面上的点
      • 2d索引,用于存储和查找平面上的点
    • 哈希索引(Hashed Index)
      • 针对属性的哈希值进行索引查询,当要使用Hashed index时,MongoDB能够自动的计算hash值,无需程序计算hash值。
      • hash index仅支持等于查询,不支持范围查询。

    重点需要掌握的是【单字段索引】、【2dsphere索引】。

    3.1.单字段索引

     示例:

    1. #单字段索引,1表示升序创建索引,-1表示降序创建索引
    2. db.集合名.createIndex({"字段名":排序方式})
    3. #示例,创建user集合,其中username字段设置索引
    4. db.user.createIndex({"username":1})
    5. db.user.insert({id:1,username:'zhangsan',age:20})
    6. db.user.insert({id:2,username:'lisi',age:22})
    7. #查看索引
    8. db.user.getIndexes()
    9. #查看索引大小,单位:字节
    10. db.user.totalIndexSize()
    11. #删除索引
    12. db.user.dropIndex("username_1")
    13. #或者,删除除了_id之外的索引
    14. db.user.dropIndexes()

    3.2.地理空间索引

    MongoDB地理空间索引类型有:

    • Point(坐标点),coordinates必须是单个位置
    • MultiPoint(多个点),coordinates必须是位置数组
    • LineString(线形),coordinates必须是两个或多个位置的数组
    • MultiLineString(多行线形),coordinates必须是LineString坐标数组的数组
    • Polygon(多边形),coordinates成员必须是 LinearRing 坐标数组的数组,必须是闭环,也就是第一个和最后一个坐标点要相同。
    • MultiPolygon(多个多边形),coordinates成员必须是 Polygon 坐标数组的数组。
    • GeometryCollection(几何集合),geometries是任何一个对象的集合。

     示例:

    1. #2dsphere索引
    2. db.集合名.createIndex({"字段名":"2dsphere"})
    3. #示例,创建user集合,其中loc字段设置索引
    4. db.user.createIndex({"loc":"2dsphere"})
    5. db.user.insert({id:3,username:'wangwu',age:21,loc:{type:"Point",coordinates:[116.343847,40.060539]}})
    6. db.user.insert({id:4,username:'zhaoliu',age:23,loc:{type:"Point",coordinates:[121.612112,31.034633]}})
    7. #多边形索引类型示例
    8. #为scpoe集合中的scpoe字段设置球面索引
    9. db.scope.createIndex({"scpoe":"2dsphere"})
    10. #为了便于理解,这里采用x、y坐标系的值来模拟快递员的作业范围
    11. #coordinates格式必须是:[ [ [x,y],[x,y],[x,y] ] ]
    12. db.scope.insert({
    13. id: 1,
    14. username: 'shkdy',
    15. scpoe: {
    16. type: "Polygon",
    17. coordinates: [
    18. [
    19. [0,0],
    20. [3,0],
    21. [3,3],
    22. [0,3],
    23. [0,0]
    24. ]
    25. ]
    26. }
    27. })
    28. db.scope.insert({
    29. id: 2,
    30. username: 'bjkdy',
    31. scpoe: {
    32. type: "Polygon",
    33. coordinates: [
    34. [
    35. [- 3, 3],
    36. [3, 3],
    37. [3, - 3],
    38. [- 3, - 3],
    39. [- 3, 3]
    40. ]
    41. ]
    42. }
    43. })
    44. #假设,现在有坐标点[-1,-1]用户下单,就需要查询到所在服务范围内的快递员
    45. #$geoIntersects 查询与指定的几何图形(这里用的是点)相交的数据
    46. #$geometry 指定几何图形
    47. db.scope.find({
    48. scpoe: {
    49. $geoIntersects: {
    50. $geometry: {
    51. type: "Point",
    52. coordinates: [-1, -1]
    53. }
    54. }
    55. }
    56. })
    57. #显然,只能查询到【bjkdy】
    58. #如何坐标点改为[1,1],就可以查询到这两个快递员
    59. db.scope.find({
    60. scpoe: {
    61. $geoIntersects: {
    62. $geometry: {
    63. type: "Point",
    64. coordinates: [1, 1]
    65. }
    66. }
    67. }
    68. })

     四、UI客户端工具

     前面我们是通过命令行操作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结构数据:

     

  • 相关阅读:
    MySql存储引擎
    设计模式——模板方法模式
    汇编语言程序(环境是dosbox)
    30个 Java 集合面试必备的问题
    循环神经网络(四)
    数据库系统概论第六章(关系数据理论)知识点总结(1)—— 函数依赖概念总结
    功能测试做自动化必须了解的3件事,受用终生【建议收藏】
    【C语言】详解计算机二级c语言程序题
    已有项目与git建立连接、老项目搭建git管理
    计算机毕业论文java毕业设计选题源代码javaweb火车车辆购票管理系统[包运行成功]
  • 原文地址:https://blog.csdn.net/m0_73499047/article/details/132873625