• MongoDB 基础了解(三)


    目录

    一、MongoDB 集合操作

    1.创建集合

    2.查看集合

    3.删除集合

    二、MongoDB 文档操作

    1.插入文档

    1.单条插入

    2.批量插入

    2.更新文档

    3.文档查询

    1.AND 条件

    2.OR 条件

    3.AND 和 OR 联合

    4.排序

    5.总条数

    6.去重

    7.指定返回字段

    二、MongoDB 数据备份与恢复

    1.数据备份

    2.数据恢复


    一、MongoDB 集合操作

    MongoDB中的集合是一组文档的集,相当于关系型数据库中的表。

    1.创建集合

    MongoDB使用 db.createCollection()函数来创建集合。

    语法格式:db.createCollection(name,options)。

    name:要创建的集合名称。

    options:可选参数,指定有关内存大小及索引的选项。

    创建一个默认选项的集合 c1 命令如下:

    1. > db.createCollection("c1")
    2. { "ok" : 1 }
    3. # 这个命令创建的表可以查看到
    4. > show tables
    5. c1
    6. system.users
    7. system.version

    提示:其实在MongoDB中创建文档时会自动创建集合,除非你对创建的集合有特殊的需求。

    1. #方式一:
    2. > db.c2.insert({"a":1}) #当第一个文档插入时,集合就会被创建并包含该文档
    3. #方式二:
    4. > db.c3 #创建一个空集合,里面没有数据时,通过 show tables 或 show collections 是无法查看到的。需要向集合中插入一个文档才能看见。

    2.查看集合

    通过 show tables 或 show collections 查看所有集合。

    通过 db.COLLECTION_NAME.stats() 查看集合详情。

    3.删除集合

    通过 db.COLLECTION_NAME.drop()删除集合。

    1. > db.c1.drop()
    2. true
    3. > show tables
    4. c2
    5. c4
    6. system.users
    7. system.version

    二、MongoDB 文档操作

    1.插入文档

    1.单条插入

    可以使用 insert/insertone/save 插入单条文档:

    • db.c1.insert(("name":"a"))
    • db.c1.insertOne({"name":"a"})
    • db.c1.save(("name":"a"})

    (1)insert:

    通过 db.COLLECTION_NAME.insert(document)插入文档。

    插入文档时如果没有指定_id 则默认为 ObjectId类型,_id不能重复,且在插入后不可变。

    1. > user1 ={
    2. ... "name":"zhangsan",
    3. ... "age":18,
    4. ... "hobbies":["music", "read"],
    5. ... "addr":{
    6. ... "country":"China",
    7. ... "city":"BJ"
    8. ... }
    9. ... }
    10. > db.user.insert(user1)

    (2)insterOne

    在MongoDB 3.2版本以后,提供了 insertOne()函数用于插入单条文档。

    1. # 指定了 id
    2. > user2 ={
    3. ... "_id":"2",
    4. ... "name":"lisi",
    5. ... "age":20,
    6. ... "hobbies":["music", "read"],
    7. ... "addr":{
    8. ... "country":"China",
    9. ... "city":"SH"
    10. ... }
    11. ... }
    12. > db.user.insertOne(user2)
    13. { "acknowledged" : true, "insertedId" : "2" }

    (3)save

    插入文档也可以使用 db.COLLECTION_NAME.save(document) 命令。

    如果不指定_id字段 save()方法等同于insert()方法,随机生成。如果指定存在的_id字段,则变为更新文档的操作。 

    2.批量插入

            可以使用 insert/insertMany/save 插入多条文档。区别在于把单条插入时函数参数的对象类型{} 变成数组类型 [ {},{} ] :

    • db.c1.insert([{name:"a"}, {name:"b"}])
    • db.c1.insertMany([{name:"a"}, {name:"b"}])
    • db.c1.save([{name:"a"}, {name:"b"}])
    1. > user3 ={
    2. ... "_id":"3",
    3. ... "name":"qq",
    4. ... "age":20,
    5. ... "hobbies":["music", "read"],
    6. ... "addr":{
    7. ... "country":"China",
    8. ... "city":"SH"
    9. ... }
    10. ... }
    11. > user4 ={
    12. ... "_id":"4",
    13. ... "name":"li",
    14. ... "age":20,
    15. ... "hobbies":["music", "read"],
    16. ... "addr":{
    17. ... "country":"China",
    18. ... "city":"SH"
    19. ... }
    20. ... }
    21. > user5 ={
    22. ... "_id":"5",
    23. ... "name":"li9",
    24. ... "age":20,
    25. ... "hobbies":["music", "read"],
    26. ... "addr":{
    27. ... "country":"China",
    28. ... "city":"SH"
    29. ... }
    30. ... }
    31. > db.user.insert([user3,user4,user5])
    32. BulkWriteResult({
    33. "writeErrors" : [ ],
    34. "writeConcernErrors" : [ ],
    35. "nInserted" : 3,
    36. "nUpserted" : 0,
    37. "nMatched" : 0,
    38. "nModified" : 0,
    39. "nRemoved" : 0,
    40. "upserted" : [ ]
    41. })

    2.更新文档

            通过 update 系列函数或者 save 函数可以更新集合中的文档,我们来详细看下 update 函数的使用,上一节已经介绍过 save 函数。

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

    db.COLLECTION_NAME.update(query, update, {upsert,multi}) 
    • query:update 的查询条件,类似SQL update 语句中的where部分。
    • update:update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为SQL update 语句中的set 部分。
    • upsert:可选,如果不存在 update 的文档,是否插入该文档,true为插入,默认是false,不插入。
    • multi:可选,是否批量更新。true表示按条件查询出来的多条记录全部更新,false只更新找到的第一条记录,默认是 false。 
    1. user = {
    2. "name":"wangwu",
    3. "age":20,
    4. "hobbies":["music","read"],
    5. "addr":{
    6. "country":"China",
    7. "city":"BJ"
    8. }
    9. }
    10. #修改单条
    11. db.user.update({"name":"lisi"},user) #这个更新是将符合条件的全部更新成后面的文档,相当于先删除在更新
    12. db.user.update({"name":"list"},{$set:{name:"mingming"}}) #保留原来数据更新,但是只更新符合条件的第一条数据
    13. db.集合名称.update({name:"小黑"},{$set:{name:"小明"}},{multi:true})
    14. #保留原来数据更新,更新符合条件的所有数据
    15. db.集合名称.update({name:"小黑"},{$set:{name:"小明"}},{multi:true,upsert:true})
    16. 保留原来数据更新,更新符合条件的所有数据没有条件符合时插入数据
    17. 注意:更新文档是更新整个文档的操作,如果修改的值只有name和age,除了_id以外其他属性将会被删除。

    3.文档查询

    MongoDB查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。 语法 :

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

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

    > db.集合名称.find().pretty()

    注意:pretty() 方法以格式化的方式来显示所有文档。

    1. # 创建表并插入文档
    2. > for(let i=0;i<10;i++){ db.users.insert({name:'sky_'+i,age:24,_id:i})}
    3. > db.users.find()
    4. { "_id" : 0, "name" : "sky_0", "age" : 24 }
    5. { "_id" : 1, "name" : "sky_1", "age" : 24 }
    6. { "_id" : 2, "name" : "sky_2", "age" : 24 }
    7. { "_id" : 3, "name" : "sky_3", "age" : 24 }
    8. { "_id" : 4, "name" : "sky_4", "age" : 24 }
    9. { "_id" : 5, "name" : "sky_5", "age" : 24 }
    10. { "_id" : 6, "name" : "sky_6", "age" : 24 }
    11. { "_id" : 7, "name" : "sky_7", "age" : 24 }
    12. { "_id" : 8, "name" : "sky_8", "age" : 24 }
    13. { "_id" : 9, "name" : "sky_9", "age" : 24 }
    14. > db.users.update({"_id":9},{$set:{age:29}})

    1.AND 条件

    > db.集合名称.find({key1:value1,key2:value2,...}).pretty()

    类似于 WHERE 语句:WHERE key1=value1 AND key2=value2

    2.OR 条件

    MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

    > db.集合名称.find({$or:[{key1:value1},{key2:value2}]).pretty()

    类似于 WHERE 语句:WHERE key1=value1 or key2=value2

    3.AND 和 OR 联合

    类似SQL语句为:'where age >50 AND(name='sky' OR name ='MongoDB')'

    1. > db.集合名称.find({"age”:{$gt:50},$or:[{"name":"sky"},{"name":"MongoDB"}]}).pretty()
    2. > db.users.find({"age":24,$or:[{"name":'sky_4'},{"name":'sky'}]});
    3. { "_id" : 4, "name" : "sky_4", "age" : 24 }

    4.排序

    1. > db.集合名称.find().sort({name:1,age:1})
    2. # 1 升序  -1 降序

    类似 SQL 语句为:'order by name,age'

    5.总条数

    1. > db.集合名称.count()
    2. > db.集合名称.find({"name""sky"}).count()

    类似于 SQL语句为:'select count(id) from...'

    6.去重

    > db.集合名称.distinct('字段')

    7.指定返回字段

    1. > db.集合名称.find({条件},{name:1,age:1})
    2. 1返回 o不返回

    注意:1和0不能同时使用

    二、MongoDB 数据备份与恢复

    1.数据备份

            在Mongodb中我们使用 mongodump 命令来备份 MongoDB 数据。该命令可以导出所有数据到指定目录中。

            mongodump 命令可以通过参数指定导出的数据量级转存的服务器。

            Mongodump 命令脚本语法如下:

    mongodump -h dbhost -d dbname -o dbdirectory
    • -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
    • -d: 需要备份的数据库实例,例如:test
    • -o: 备份的数据存放位置,例如:d:\mongodb\data\dump,当然该目录需要提前建立,在备份完 成后,系统自动在dump目录下建立一个(与备份数据库同名)目录,这个目录里面存放该数据库实例的备份数据。

    进入MongoDB安装目录的 bin目录输入如下命令:

    1. # 对有安全认证的MongoDB备份操作:
    2. mongodump -h 127.0.0.1:27017 -u uaad -p uaad -d users -o /root/mongo --authenticationDatabase admin
    3. -u 用户名
    4. -p 用户密码
    5. --authenticationDatabase 指定校验的数据库

    2.数据恢复

    mongodb使用 mongorestore 命令来恢复备份的数据,其命令脚本语法如下:

    mongorestore -h dbhost -d dbname dbdirectory
    
    • -h:MongoDB所在服务器地址
    • -d:需要恢复的数据库实例,例如:test,也可以自定义名称
    • --directory:备份数据所在位置,例如:D:\mongodb\data\dump\users,这里路径要具体到文件名users
    mongodump -h 127.0.0.1:27017 -u uaad -p uaad -d user -o /root/mongo/users --authenticationDatabase admin
  • 相关阅读:
    为什么我们如此热爱Python
    【Linux初阶】信号入门 | 信号基本概念+信号产生+核心转储
    第一百五十一回 自定义组件综合实例:游戏摇杆二
    35分钟了解sql注入-盲注(三)
    4_1_linux
    JS中的构造函数
    CSS 属性计算过程
    UDP的报文结构和注意事项
    goLang context组件学习笔记
    数据可视化系列教程之组件通信
  • 原文地址:https://blog.csdn.net/weixin_46560589/article/details/126280653