MongoDB数据修改总结

MongoDB数据修改总结
2013-10-26 10:08:30      我来说两句    来源:huhui的专栏   
收藏  我要投稿

MongoDB数据修改总结

1.前言

最近在学习MongoDB,数据修改这一部分的内容较多,命令比较繁琐,所以将一些常用的修改命令总结在这篇博客中,方便今后学习的查阅。

2.命令总结

1). insert()

db.collection.insert(x)  x就是要更新的对象,只能是单条记录,如:

[plain]

db.collection.insert({_id:1,name:"test",count:1})

当需要批量插入的时候,可以在shell中使用for循环,如:

[plain]

for(var i=0;i<16;i++){

db.mytest.insert({_id:i,name:"test"+i,count:i})

}

此时如果用find()命令查询插入的数据,结果是这样的:

[plain]

> db.mytest.find()

{ "_id" : 0, "name" : "test0", "count" : 0 }

{ "_id" : 1, "name" : "test1", "count" : 1 }

{ "_id" : 2, "name" : "test2", "count" : 2 }

{ "_id" : 3, "name" : "test3", "count" : 3 }

{ "_id" : 4, "name" : "test4", "count" : 4 }

{ "_id" : 5, "name" : "test5", "count" : 5 }

{ "_id" : 6, "name" : "test6", "count" : 6 }

{ "_id" : 7, "name" : "test7", "count" : 7 }

{ "_id" : 8, "name" : "test8", "count" : 8 }

{ "_id" : 9, "name" : "test9", "count" : 9 }

{ "_id" : 10, "name" : "test10", "count" : 10 }

{ "_id" : 11, "name" : "test11", "count" : 11 }

{ "_id" : 12, "name" : "test12", "count" : 12 }

{ "_id" : 13, "name" : "test13", "count" : 13 }

{ "_id" : 14, "name" : "test14", "count" : 14 }

{ "_id" : 15, "name" : "test15", "count" : 15 }

2). update()

db.collection.update( criteria, objNew, upsert, multi )    四个参数的说明如下:

criteria: update的查询条件,类似sql update查询内where后面的

objNew: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的

upsert: 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

multi: mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

几个查询例子如下:

db.mytest.update({count:{$gt:1}},{$set:{name:"ok"}})                                  只更新第一条记录

db.mytest.update({count:{$gt:3}},{$set:{name:"ok"}},false,true)                  大于3的全部更新了

db.mytest.update({count:{$gt:4}},{$set:{name:"ok123"}},true,false)            只更新了一条

db.mytest.update({count:{$gt:6}},{$set:{name:"ok123"}},true,true)              大于6的全部更新了

3). save()

db.collection.save(x) x是要插入的对象,效果与上面的insert命令一样。save与insert的区别是这样的:

在进行插入数据的操作中,当遇到_id相同的情况下,save完成保存操作,insert则会保存;即_id相同情况下,save相当于更新操作。

下面是一些MongoDB的更新操作符

4). $inc

用法:{$inc:{field:value}}   意思是对一个数字字段field增加value:

[plain]

> db.mytest.find({_id:1})

{ "_id" : 1, "name" : "test1", "count" : 1 }

> db.mytest.update({_id:1},{$inc:{count:1}})

> db.mytest.find({_id:1})

{ "_id" : 1, "name" : "test1", "count" : 2 }  //count字段加1

value的值也可以为负,就相当于减一个值:

[plain]

> db.mytest.update({_id:1},{$inc:{count:-2}})

> db.mytest.find({_id:1})

{ "_id" : 1, "name" : "test1", "count" : 0 }  //值从2减到0

5). $set命令

用法:{$set:{field:value}}

相当于在关系型数据库中sql的set field=value,全部数据类型都支持$set操作

[plain]

> db.mytest.update({_id:1},{$set:{count:111}})

> db.mytest.find({_id:1})

{ "_id" : 1, "name" : "test1", "count" : 111 }   //修改数值型

> db.mytest.update({_id:1},{$set:{name:"MongoDB"}})

> db.mytest.find({_id:1})

{ "_id" : 1, "count" : 111, "name" : "MongoDB" }   //修改字符型

6). $unset

用法:{$unset:{field:1}}

[plain]

> db.mytest.find({_id:1})

{ "_id" : 1, "count" : 111, "name" : "MongoDB" }

> db.mytest.update({_id:1},{$unset:{name:1}})

> db.mytest.find({_id:1})

{ "_id" : 1, "count" : 111 }  //删除了字段name

7). $push

用法:{$push:{field:value}}

把value追加到field中取,field一定是数据类型才行,如果field不存在,会新增一个数组类型加进去:

[plain]

> db.mytest.update({_id:15},{$set:{array:["aaa","bbb"]}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb" ], "count" : 15, "name" : "ok123" }

使用push追加数据:

[plain]

> db.mytest.update({_id:15},{$push:{array:"ccc"}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb",  "ccc" ], "count" : 15, "name" : "ok123" }

push一次只能追加一个值,如果需要追加多个值,则需要使用$pushAll:

[plain]

> db.mytest.update({_id:15},{$pushAll:{array:["ddd","eee","fff"]}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb",  "ccc",  "ddd",  "eee",  "fff" ], "count" : 15, "name" : "ok123" }

8). $addToSet

用法:{$addToSet:{field:value}}

增加一个值到数组内,而且只有当这个值不在数组内才增加:

[plain]

> db.mytest.update({_id:15},{$addToSet:{array:"123"}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb",  "123" ], "array2" : [  "mmm",  "nnn"], "count" : 15, "name" : "ok123" }

> db.mytest.update({_id:15},{$addToSet:{array:"aaa"}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb",  "123" ], "array2" : [  "mmm",  "nnn"], "count" : 15, "name" : "ok123" }

9). $pop

删除数组内的一个值,删除最后一个值:{$pop:{field:1}} ,删除第一个值:{$pop:{field:-1}}

[plain]

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb",  "123" ], "array2" : [  "mmm",  "nnn"], "count" : 15, "name" : "ok123" }

> db.mytest.update({_id:15},{$pop:{array:1}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb" ], "array2" : [  "mmm",  "nnn" ], "count" : 15, "name" : "ok123" }

10). $pull

用法:$pull:{field:value}   从数组中删除一个等于value的值:

[plain]

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "aaa",  "bbb" ], "array2" : [  "mmm",  "nnn" ], "coun

t" : 15, "name" : "ok123" }

> db.mytest.update({_id:15},{$pull:{array:"aaa"}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "bbb" ], "array2" : [  "mmm",  "nnn" ], "count" : 15,

"name" : "ok123" }

11). $pullAll

用法同$pull,可以一次删除数组内的多个值:

[plain]

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "bbb" ], "array2" : [  "mmm",  "nnn" ], "count" : 15,"name" : "ok123" }

> db.mytest.update({_id:15},{$pullAll:{array2:["mmm","nnn"]}})

> db.mytest.find({_id:15})

{ "_id" : 15, "array" : [  "bbb" ], "array2" : [ ], "count" : 15, "name" : "ok123" }

12). $

可以理解为数组定位器,看一个官方文档的例子:

[plain]

> t.find()

{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }

> t.update( {‘comments.by‘:‘joe‘}, {$inc:{‘comments.$.votes‘:1}})

> t.find()

{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

需要注意的是,$只会找到第一条数组项,后面的就不管了:

[plain]

> db.mytest.find({_id:16})

{ "_id" : 16, "x" : [  1,  2,  3,  1 ] }

> db.mytest.update({x:1},{$inc:{"x.$":1}})

> db.mytest.find({_id:16})

{ "_id" : 16, "x" : [  2,  2,  3,  1 ] }

还有一点需要注意,当$配合$unset使用的时候,会留下一个null的数组项,这个问题可以使用{$pull:{x:null}}解决:

[plain]

> db.mytest.find({_id:16})

{ "_id" : 16, "x" : [  2,  2,  3,  1 ] }

> db.mytest.update({x:3},{$unset:{"x.$":1}})

> db.mytest.find({_id:16})

{ "_id" : 16, "x" : [  2,  2,  null,  1 ] }

> db.mytest.update({_id:16},{$pull:{x:null}})

> db.mytest.find({_id:16})

{ "_id" : 16, "x" : [  2,  2,  1 ] }

时间: 2024-12-15 00:34:11

MongoDB数据修改总结的相关文章

MongoDB数组修改器更新数据

MongoDB数组修改器更新数据 2013-04-22 10:20:40      我来说两句    来源:姜志福 的BLOG    收藏  我要投稿 MongoDB数组修改器更新数据 这里,我们将了解一下数组修改器.数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用.数组修改器,顾名思义,它是用来修改数组的,而不能用来修改整数或者字符串.数组修改器不多,就那么几个,但熟练掌握它后,将给我们带来非常方便的操作.下面,我们来了解一下: > db.us

MongoDB数组修改器更新数据(转)

MongoDB数组修改器更新数据 这里,我们将了解一下数组修改器.数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用.数组修改器,顾名思义,它是用来修改数组的,而不能用来修改整数或者字符串.数组修改器不多,就那么几个,但熟练掌握它后,将给我们带来非常方便的操作.下面,我们来了解一下: > db.user.findOne() { "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"

MongoDB 数据迁移和同步

MongoDB 数据迁移和同步 MongoDB的数据同步 复制 mongodb的复制至少需要两个实例.其中一个是主节点master,负责处理客户端请求,其余的都是slave,负责从master上复制数据. master写处理:master负责接收写请求,具体的流程为: 如果开启journal功能,则先将写请求记录到journal中,然后批量执行,同时将操作记录到oplog中: 如果未开启journal功能,则对每个写请求进行单独操作,然后写入oplog. 注:oplog是幂等的,当有累加操作in

MongoDB数据表基本操作

MongoDB数据表基本操作 查看全部数据表 > use ChatRoom switched to db ChatRoom > show collections Account Chat system.indexes system.users 创建数据表 > db.createCollection("Account") {"ok":1} > db.createCollection("Test",{capped:true,

将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决

需求:将mongodb 数据指定字段导出,然后再指定字段导入mysql  表中 直接上图吧, 最后 会将遇到几个问题及解决方案贴出,以便遇到类似问题可以迅速解决(期间所用命令具体用法不在本文详解之内) 将mongodb 数据指定字段导出,所用命令Mongoexport ,具体查阅官方文档: 导出指定二级字段 Mongodb /opt/mongodb/bin/mongoexport  --host yourip  --port yourport   -d app_form -c applicati

MongoDB 数据存储引擎

存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储引擎(Storage Engine),MongoDB支持的存储引擎有:WiredTiger,MMAPv1和In-Memory. 从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine,用于将数据持久化存储到硬盘文件中,WiredTiger提供文档级别

单据数据修改历史记录!

0.可记录历史数据的表单设计 http://blog.csdn.net/snleo/article/details/1876784 1.常见数据库设计(3)——历史数据问题之多记录变更 http://www.cnblogs.com/dataadapter/archive/2012/08/28/2660103.html 2.常见数据库设计(2)——历史数据问题之单记录变更 http://www.cnblogs.com/dataadapter/archive/2012/06/05/2535529.h

nodejs 通过 get获取数据修改redis数据

如下代码是没有报错的正确代码 我通过https获取到数据 想用redis set一个键值存储 现在我掉入了回调陷阱res.on 里面接收到的数据是data 里面如果放入 client.on('connect',functi ...这个修改函数就会报错. 'use strict'; var redis = require('redis'), RDS_PORT = 6379, //端口号 RDS_HOST = '127.0.0.1', //服务器IP //RDS_PWD = 'porschev',

MongoDB数据文件内部结构

有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里. 数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据.在MongoDB中,名字空间用于区分不同的存储类别.比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间. 在一个块中,会保存多条记录,每条记录是B