[310]MongoDB数据插入、删除、更新、批量更新某个字段

批量更新某个字段

例1:

db.getCollection('bond_sentiment_news').find({"source" : 2,"siteUrl" : "http://www.21jingji.com/"}).forEach(
   function(item){                
       db.getCollection('bond_sentiment_news').update({"_id":item._id},{$set:{"siteName":"21经济网"}})
   }
)

例2:

db.getCollection('my_booking').find({"hospitalName":/xx医院/,openId:/^2/}).forEach(
   function(item){                
       db.getCollection('my_booking').update({"_id":item._id},{$set:{"payType": "1"}})
   }
)

查询出hospitalName是xx医院和openId以2开头的所有记录,并且更新my_booking表中的payType为1.

例3:

db.getCollection('my_booking').find({"hospitalName":/运城市中心医院/,openId:{$not:/^2/}}).forEach(
   function(item){                
       db.getCollection('my_booking').update({"_id":item._id},{$set:{"outTradeNo1": item.outTradeNo2}})
   }
)

查询出xx医院和不已2开头的openId的所有记录,并且将每条记录的outTradeNo2赋值给outTradeNo1.

1. MongoDB数据插入

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

sample结果:
这里写图片描述

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

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

2. MongoDB数据删除

  1. 删除列表中所有数据
    db.[collectionName].remove({})
    集合的本身和索引不会被删除
  2. 根据条件删除数据
db.[collectionName].remove({key:value})

删除集合sample中name等于c的纪录

db.sample.remove({name:"c"})

这里写图片描述

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

3. MongoDB数据更新

  1. 强硬的文档替换式更新操作
// 语法
db.[collectionName].update({查询器},{修改器})

此种文档更新方式,会用新的文档代替老的文档,因此要明确是否是真的符合自己的需求。
这里写图片描述

强硬的更新会用新的文档代替老的文档
2. insertOrUpdate操作
目的:查询器查出来数据就执行更新操作,查不出来就替换操作
做法:

db.[collectionName].update({查询器},{修改器},true)

第三个参数设置为true,代表insertOrUpdate,即存在即更新,否则插入该数据
这里写图片描述

3. 批量更新操作
默认情况下,当查询器查询出多条符合条件的数据时,默认修改第一条数据。那么如何实现批量修改?
语法:

db.[collectionName].update({查询器},{修改器},false, true)

即添加第四个参数,该参数为true,则批量更新,为false,则更新一条
这里写图片描述

4. 使用修改器来完成局部更新操作

4.1 $set修改器
$set修改器用来指定一个键值对,如果存在键就进行修改不存在则进行添加。

// 修改器名称:$set
// 语法:
{$set:{field: value}}
// example:
{$set:{name:"Redis"}}

这里写图片描述

4.2inc修改器inc修改器只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作.

// 修改器名称:$inc
// 语法:
{ $inc : { field : value } }
// example:
{ $inc : { "count" : 1 } } 

案例:
这里写图片描述

4.3 unset修改器unset修改器用法很简单,就是删除指定的键值对。

// 修改器名称:$unset
// 语法:
{ $unset: { field : 1} }
// example:
{ $unset : { "age" : 1 } } 

案例:
这里写图片描述

4.4 $push修改器

$push修改器用法:
1.如果指定的键是数组增追加新的数值
2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array
3.如果不存在指定的键则创建数组类型的键值对
4.此方法可添加重复数据

// 修改器名称:$push
// 语法:{ $push : { field : value } }
// example:
{ $push : { language:"Oracle"}

下面对用法一一举例:
如果指定的键是数组增追加新的数值:
这里写图片描述

如果指定的键不是数组则中断当前操作:
这里写图片描述

如果不存在指定的键则创建数组类型的键值对:
这里写图片描述

此方法可添加重复数据:
这里写图片描述

4.5 $pushAll修改器
$pushAll修改器用法和$push相似他可以批量添加数组数据
即可以添加整个数组,如下:

// 修改器名称:$pushAll
// 语法:{ $pushAll : { field : array} }
// example:
{ $pushAll : { database:["Oracle","MySQL"]}

案例:
这里写图片描述

4.6 $addToSet修改器
$addToSet修改器是如果目标数组存在此项则不操作,不存在此项则加进去,即不添加重复数据。

// 修改器名称:$addToSet
// 语法:{ $addToSet: { field : value } }
// example:
{ $addToSet: { database:"Oracle"}

案例:
这里写图片描述

4.7 $pop修改器
$pop修改器从指定数组删除一个值1删除最后一个数值,-1删除第一个数值。

// 修改器名称:$pop
// 语法:{ $pop: { field : value } }
// example:
{ $pop: { database:1}

案例:
这里写图片描述

4.8 $pull修改器
$pull修改器是删除一个被指定的数值。

// 修改器名称:$pull
// 语法:{ $pull: { field : value } }
// example:
{ $pull: { database: "Oracle"}

案例:
这里写图片描述

4.9 $pullAll修改器
$pullAll修改器是一次性删除多个指定的数值。

// 修改器名称:$pullAll
// 语法:{ $pullAll: { field : array} }
// example:
{ $pullAll: { database: ["MySQL","MongoDB"]}

案例:
这里写图片描述

4.10 $数组定位符
1.$数组定位器,如果数组有多个数值我们只想对其中一部分进行操作我们就要用到定位器($)

// 修改器名称:$
// 语法:{ $set: { array.$.field : value} }
// example:
{ $set: { database.$.com : "sun"}

例如有文档:
{ “_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"}})

这里写图片描述

5 . $addToSet$each结合完成批量数组更新

db.sample.update({name:"evers"},{$addToSet:{database:{$each:["JS","DB","DB" ]}}})

$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 
}).value

这里写图片描述

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

  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 将股票数据插入MongoDB 中时,可以使用 MongoDB 的唯一索引功能来避免重复插入相同的数据。 具体而言,可以在插入数据前,先检查该数据是否已经存在于 MongoDB 中。若数据已存在,则可以选择更新该条数据,或者直接跳过该数据,不进行插入操作。 为了实现这一功能,可以在 MongoDB 中为股票数据的唯一标识字段(比如股票代码)创建唯一索引。这样,在插入数据时,如果插入数据已经存在于 MongoDB 中,则会触发唯一索引的限制,从而防止数据重复插入。 除此之外,还可以使用 MongoDB 的 upsert(更新/插入)操作,在执行插入操作时,如果该数据已经存在,则会执行更新操作。这样既能够避免数据重复插入,又能够保证数据更新。 ### 回答2: 要避免将重复的股票数据插入MongoDB中,我们可以采取以下措施: 1. 创建唯一索引:在MongoDB中,我们可以为股票数据集合中的某个字段(如股票代码)创建唯一索引。这样一来,当尝试插入具有相同股票代码的记录时,MongoDB将会报错并拒绝插入,从而避免重复数据插入。 2. 使用upsert操作:在插入股票数据之前,我们可以通过使用upsert操作来检查是否已存在相同股票代码的记录。通过在插入时使用upsert操作,MongoDB将会根据查询条件来执行插入更新操作。如果查询条件匹配到一条记录,则进行更新操作;如果查询条件未匹配到任何记录,则执行插入操作,从而避免重复插入相同股票代码的数据。 3. 通过数据预处理进行筛选:在将股票数据插入MongoDB之前,我们可以通过预处理步骤对要插入数据进行筛选。可以使用算法或规则来过滤出具有不同股票代码的数据,确保只有非重复的数据插入MongoDB中。 4. 进行数据清洗和去重:在将股票数据插入MongoDB之前,可以对数据进行清洗和去重操作,去除其中的重复数据。可以使用一些数据清洗的方法,比如使用唯一性约束、数据合并或使用数据清洗工具进行重复数据的清除。 总之,通过创建唯一索引、使用upsert操作、数据预处理和数据清洗等多种方法,我们可以有效避免将重复的股票数据插入MongoDB中。 ### 回答3: 要避免股票数据插入MongoDB中时重复,可以考虑以下几种方法: 1. 设置唯一索引:在MongoDB集合中创建一个唯一索引,以确保插入数据在某个字段上是唯一的。可以选择使用股票代码、日期、或者其他字段作为唯一索引的依据。 2. 使用upsert操作:在插入数据时,可以使用upsert(update + insert)操作,如果插入数据已经存在,就更新数据;如果数据不存在,则插入新的数据。 3. 使用更新操作:在插入数据之前,先进行查询,判断是否已存在相同的数据。如果存在相同数据,可以选择更新操作,即更新已存在的数据。如果不存在相同数据,则进行插入操作。 4. 数据去重处理:在插入数据之前,可以先对待插入数据进行去重处理,排除已存在的数据。可以通过在MongoDB中对已有数据进行查询,然后将待插入数据中已存在的数据去除,只插入新的数据。 5. 使用批量插入:将待插入数据进行批量插入,使用MongoDB的批量插入操作,会自动过滤掉已存在的数据,只插入新的数据。 以上是几种可以避免股票数据重复插入MongoDB的方法,根据具体的需求和实际情况选择适合的方法来实现数据去重。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值