设为首页 收藏本站
查看: 804|回复: 0

[经验分享] MongoDB数据插入、删除、更新

[复制链接]

尚未签到

发表于 2018-10-24 12:24:46 | 显示全部楼层 |阅读模式
1. MongoDB数据插入

  •   MongoDB插入文档
// 插入语法  
db.[collectionName].insert({})
  
// example
  
db.sample.insert({name:"mongo"})1234
  sample结果:

  2. 批量插入文档
  shell 这样执行是错误的 db.[collectionName].insert([{},{},{},……..]),这样仅可以插入第一条数据。
  如图:

  shell 不支持批量插入
  想完成批量插入可以用MongoDB的应用驱动或是shell的for循环
  3.Save操作
  save操作和insert操作区别在于当遇到_id相同的情况下
  save完成保存操作
  insert则会报错
  如图:

2. MongoDB数据删除

  •   删除列表中所有数据
      db.[collectionName].remove({})
      集合的本身和索引不会被删除
  •   根据条件删除数据
db.[collectionName].remove({key:value})1  删除集合sample中name等于c的纪录
db.sample.remove({name:"c"})1

  3.小技巧
  如果你想清除一个数据量十分庞大的集合直接删除该集合并且重新建立索引的办法比直接用remove的效率会高很多
3. MongoDB数据更新

  •   强硬的文档替换式更新操作
// 语法  
db.[collectionName].update({查询器},{修改器})12
  此种文档更新方式,会用新的文档代替老的文档,因此要明确是否是真的符合自己的需求。

  强硬的更新会用新的文档代替老的文档
  2. insertOrUpdate操作
  目的:查询器查出来数据就执行更新操作,查不出来就替换操作
  做法:
db.[collectionName].update({查询器},{修改器},true)1  第三个参数设置为true,代表insertOrUpdate,即存在即更新,否则插入该数据

  3. 批量更新操作
  默认情况下,当查询器查询出多条符合条件的数据时,默认修改第一条数据。那么如何实现批量修改?
  语法:
db.[collectionName].update({查询器},{修改器},false, true)1  即添加第四个参数,该参数为true,则批量更新,为false,则更新一条

  4. 使用修改器来完成局部更新操作
  4.1 $set修改器
  $set修改器用来指定一个键值对,如果存在键就进行修改不存在则进行添加。
// 修改器名称:$set// 语法:{$set:{field: value}}// example:{$set:{name:"Redis"}}12345

  4.2 inc修改器
  inc修改器只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作.
// 修改器名称:$inc// 语法:{ $inc : { field : value } }// example:{ $inc : { "count" : 1 } } 12345  案例:

  4.3  unset修改器
  unset修改器用法很简单,就是删除指定的键值对。
// 修改器名称:$unset// 语法:{ $unset: { field : 1} }// example:{ $unset : { "age" : 1 } } 12345  案例:

  4.4 $push修改器
$push修改器用法:1.如果指定的键是数组增追加新的数值2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array3.如果不存在指定的键则创建数组类型的键值对4.此方法可添加重复数据// 修改器名称:$push// 语法:{ $push : { field : value } }// example:{ $push : { language:"Oracle"}12345678910  下面对用法一一举例:
  如果指定的键是数组增追加新的数值:

  如果指定的键不是数组则中断当前操作:

  如果不存在指定的键则创建数组类型的键值对:

  此方法可添加重复数据:

  4.5 $pushAll修改器
  $pushAll修改器用法和$push相似他可以批量添加数组数据
  即可以添加整个数组,如下:
// 修改器名称:$pushAll// 语法:{ $pushAll : { field : array} }// example:{ $pushAll : { database:["Oracle","MySQL"]}1234  案例:

  4.6 $addToSet修改器
  $addToSet修改器是如果目标数组存在此项则不操作,不存在此项则加进去,即不添加重复数据。
// 修改器名称:$addToSet// 语法:{ $addToSet: { field : value } }// example:{ $addToSet: { database:"Oracle"}1234  案例:

  4.7 $pop修改器
  $pop修改器从指定数组删除一个值1删除最后一个数值,-1删除第一个数值。
// 修改器名称:$pop// 语法:{ $pop: { field : value } }// example:{ $pop: { database:1}1234  案例:

  4.8 $pull修改器
  $pull修改器是删除一个被指定的数值。
// 修改器名称:$pull// 语法:{ $pull: { field : value } }// example:{ $pull: { database: "Oracle"}1234  案例:

  4.9 $pullAll修改器
  $pullAll修改器是一次性删除多个指定的数值。
// 修改器名称:$pullAll// 语法:{ $pullAll: { field : array} }// example:{ $pullAll: { database: ["MySQL","MongoDB"]}1234  案例:

  4.10 $数组定位符
  1.$数组定位器,如果数组有多个数值我们只想对其中一部分进行操作我们就要用到定位器($)
// 修改器名称:$// 语法:{ $set: { array.$.field : value} }// example:{ $set: { database.$.com : "sun"}1234  例如有文档:
  { “_id” : ObjectId(“5656d2876cc2cfd9ab5373b7”), “name” : “evers”, “age” :25, “database” : [ { “type” : “Oracle”, “name” : “OracleDB” }, { “type”: “MySQL”, “name” : “MySQLDB” }, { “type” : “MongoDB”, “name” :
“MongoDBDB” } ] }
  我们要把type等于MongoDB的文档增加一个作者author是Mongo
  办法:
db.sample.update({"database.type":"MongoDB"},{$set:{"database.$.author":"Mongo"}})1

  5 . $addToSet与$each结合完成批量数组更新
db.sample.update({name:"evers"},{$addToSet:{database:{$each:["JS","DB","DB" ]}}})1  $each会循环后面的数组把每一个数值进行$addToSet操作

  6 .  内存分配与查询效率
  当document被创建的时候DB为其分配内存和预留内存,当修改操作不超过预留内层的时候则速度非常快反而超过了就要分配新的内存则会消耗时间。

  7 . runCommand函数和findAndModify函数
  runCommand可以执行mongoDB中的特殊函数,findAndModify就是特殊函数之一,他的作用是返回update或remove后的文档。
runCommand({"findAndModify":"processes",  
        query:{查询器},        sort{排序},         new:true
  
        update:{更新器},
  
        remove:true
  
       }).value// example:ps = db.runCommand({               "findAndModify":"sample",               "query":{"name":"evers"},               "update":{"$set":{"email":"1221"}},               "new":true }).value1234567891011121314

  这里有一段摘自MongoDB权威指南的findAndModify函数的介绍:
  findAndModify的调用方式和普通的更新略有不同,还有点慢,这是因为它要等待数据库的响应。这对于操作查询以及执行其他需要取值和赋值风格的原子性操作来说是十分方便的。
  findAndModify命令中每个键对应的值如下所示。
  findAndModify 字符窜,集合名。
  query 查询文档,用来检索文档的条件。
  sort 排序结果的条件。
  update 修改器文档,对所找到的文档执行的更新。
  remove 布尔类型,表示是否删除文档。
  new 布尔类型,表示返回的是更新前的文档还是更新后的文档。默认是更新前的文档。
  “update”和”remove”必须有一个,也只能有一个。要是匹配不到文档,这个命令会返回一个错误。
  这个命令有些限制。它一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。
  相比普通更新来说,findAndModify速度要慢一些。大概耗时相当于一次查找,一次更新和一次getLastError顺序执行所需的时间。
  db.runCommand(“findAndModify”:集合名,”query”:{查询条件},”upadte”:{修改器})



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625923-1-1.html 上篇帖子: MongoDB导入CSV文件乱码的问题 下篇帖子: MongoDB 删除数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表