MongoDB 文档字段增删改

MongoDB 基于CRUD(create,read,update,delete)方式实现了对集合上的文档进行增删改查。对于集合上字段的增删改,可以使用set或者unset修改器来实现。也可以使用文档替换的方式来实现。本文主要描述集合上字段的增删改,以及基于选项upsert的更新。

a.语法描述

db.collection.update(

<query>,                  //查询或过滤条件

<update>,                 //修改器(被修改键及内容)

{

upsert: <boolean>,      //为true或者false,如果为true,未找到匹配文档则创建新文档

multi: <boolean>,       //用于确定是单行还是更新所有行(true为所有行)

writeConcern: <document>  //设定写关注,用于确保强一致性还是弱一致性

}                            //后面的3.2之后的语法参数基本相同

)

其他的如updateOne,updateMany等用法请参考:MongoDB 文档更新

MongoDB集合上所有的写操作特性

原子性操作(单个文档级别原子性操作)

_id 字段无法修改,即无法使用一个新的_id值来代替

由于更新导致文档尺寸超出预期分配的情形,会自动调整填充因子,重新分配空间

保留文档字段的顺序,但是更新或重命名可能导致字段顺序重新排序(_id总是文档第一个字段)

update的几个常用修改器:

//$set修改器最常用,等同于RDBMSupdate的set子句

b.使用$set修改器修改年龄字段

> db.chenji.update({name:"李旭"},{$set:{"年龄":24}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"年纪" : "三年级",

"年龄" : 24

}

> db.chenji.find({$or:[{name:"李旭"},{"年龄":24}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"年纪" : "三年级",

"年龄" : 24

}

c. 文档新增字段($set实现)

> db.chenji.update({name:"李旭"},{$set:{add:"sex"}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"},{"年龄":24}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"年纪" : "三年级",

"年龄" : 24,

"add" : "sex"

查看新增字段add

> db.chenji.find({name:"李旭"},{"_id":0,"年纪":1,"年龄":1,add:1})

{ "年纪" : "三年级","年龄" : 24, "add" : "sex" }

d.文档删除字段

字段的删除方法为{"$unset":{field_name:1}}

> db.chenji.update({name:"李旭"},{"$unset":{add:1}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"年纪" : "三年级",

"年龄" : 24

}

> db.chenji.find({name:"李旭"},{"_id":0,"年纪":1,"年龄":1,add:1})

{ "年纪" : "三年级","年龄" : 24 }

删除年龄字段:

> db.chenji.update({name:"李旭"},{"$unset":{"年龄":1}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"年纪" : "三年级"

}

删除年纪字段:

> db.chenji.update({name:"李旭"},{"$unset":{"年纪":1}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{ "_id" :ObjectId("59987eee7cd6cda607043cd1"), "name" : "李旭"}

>

添加字段:age和年龄

> db.chenji.update({name:"李旭"},{$set:{"年级":"一年级"}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.update({name:"李旭"},{$set:{"age":9}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"age" : 9,

"年级" : "一年级"

}

e.字段值的增加或减少

当使用$inc修改器时,当字段不存在时,会自动创建该字段,如果存在,则在原有值的基础上进行增加或者减少

//$inc主要是用于专门进行数字的增加或减少,因此$inc只能用于整型,长整形,或者双精度浮点型的值

//$inc不支持字符串,数组以及其他非数字的值

//注,对于$inc的操作,$set也可以完成。$inc存在的理由是$inc更高效

> db.chenji.update({name:"李旭"},{$inc:{num:100}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"age" : 9,

"年级" : "一年级",

"num" : 100

}

再次update这个num字段会和第一次的100增加101

> db.chenji.update({name:"李旭"},{$inc:{num:101}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"age" : 9,

"年级" : "一年级",

"num" : 201

}

基于$inc的负值:

> db.chenji.update({name:"李旭"},{$inc:{num:-100}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"age" : 9,

"年级" : "一年级",

"num" : 101

}

> db.chenji.update({name:"李旭"},{$inc:{num:-50}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"age" : 9,

"年级" : "一年级",

"num" : 51

下面使用非数字来实现$inc,报错如下:

db.chenji.update({name:"李旭"},{$inc:{num:"1ab"}})

WriteResult({

"nMatched" : 0,

"nUpserted" : 0,

"nModified" : 0,

"writeError" : {

"code" : 14,

"errmsg" : "Cannot increment with non-numeric argument:{num: \"1ab\"}"

}

})

f. 时间戳字段的增加及自动更新($currentDate)

> db.chenji.update({name:"李旭"},{$inc:{num:60},$currentDate:{lastModified:true}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"name" : "李旭",

"age" : 9,

"年级" : "一年级",

"num" : 231,

"lastModified" : ISODate("2017-08-20T08:39:53.601Z")

}

f.文档字段重命名($rename)

> db.chenji.update({name:"李旭"},{$rename:{"name":"ename"}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

> db.chenji.find({$or:[{ename:"李旭"}]}).pretty()

{

"_id" : ObjectId("59987eee7cd6cda607043cd1"),

"age" : 9,

"年级" : "一年级",

"num" : 231,

"lastModified" :ISODate("2017-08-20T08:39:53.601Z"),

"ename" : "李旭"

}

> db.chenji.find({ename:"李旭"},{"_id":0,ename:1})

{ "ename" : "李旭"}

对整个集合上所有文档字段进行重命名:

>db.chenji.update({},{$rename:{"name":"ename"}},{multi:true})

WriteResult({ "nMatched" : 7,"nUpserted" : 0, "nModified" : 6 }) /此次修改为11条,因为前面以及修改过1条

> db.chenji.find();

{ "_id" :ObjectId("59990ec402730a37fe1ee79e"), "年纪": "二年级", "年龄" : "12", "ename" :"建伟" }

{ "_id" :ObjectId("59987eee7cd6cda607043cd1"), "age" : 9, "年级": "一年级", "num" : 231, "lastModified" :ISODate("2017-08-20T08:39:53.601Z"), "ename" : "李旭"}

{ "_id" :ObjectId("5998860a7cd6cda607043cd2"), "年纪": "三年级", "年龄" : "14", "ename" :"张三" }

{ "_id" :ObjectId("599886227cd6cda607043cd3"), "年纪": "四年级", "年龄" : "16", "ename" :"王三" }

{ "_id" :ObjectId("599886357cd6cda607043cd4"), "年纪": "一年级", "年龄" : "8", "ename" :"王七" }

{ "_id" :ObjectId("599886537cd6cda607043cd5"), "年纪": "一年级", "年龄" : "9", "ename" :"张巴" }

{ "_id" :ObjectId("5998866e7cd6cda607043cd6"), "年纪": "七年级", "年龄" : "16", "ename" :"谢娜" }

>

g.upsert选项用法

/ upsert相当于oracle的merge into或者mysql中的replaceinto

// upsert即是当集合中匹配到满足条件的文档时,则更新文档,否则则是新增文档。前提是该选项的值为true,缺省为flase。

> //下面的演示的是匹配到文档时的例子

小结:

a、对于文档上数据的修改有多种方式(修改器),常用的为$set修改器以及$inc

b、$inc是一种高效的数据修改器,通常用于实现数值的增加或减少,仅支持数据类型。

c、对于文档字段的增加,可以使用$set,$unset,$inc,$currentDate等方式

d、对于文档字段的删除,使用$unset方式来实现

e、upsert选项可以实现匹配的文档则更新,不匹配时则插入

参考资料:

http://blog.csdn.net/leshami/article/details/54930588

时间: 2024-08-03 15:29:30

MongoDB 文档字段增删改的相关文章

MongoDB文档的增删改操作

上一篇文章中介绍了MongoDB的一些基本知识,同时看到了怎么启动一个MongoDB服务,并且通过MongoDB自带的shell工具连接到了服务器. 这一次,就通过MongoDB shell介绍一下对文档的增删改操作. 增加新文档 接着上一篇文章,打开一个MongoDB shell. 通过“show dbs”可以看到所有的数据库.然后我们通过“use blog”切换到blog数据库来开始下面的演示. 使用“db”命令显示当前正在使用的数据库. 1 C:\mongodb\bin>mongo.exe

Mongodb的基本操作-数据库 集合 文档的增删改查

数据库操作: //查看有哪些数据库 > show dbs local  0.078GB mydb   0.078GB //use操作将切换到一个数据库 如果数据库存在将直接切换 如果不存在 那么会在切换之后,第一次执行新增修改操作的时候去创建这个数据库 > use newdb switched to db newdb //此时还没有创建 > show dbs local  0.078GB mydb   0.078GB > db.persion.insert({age:10}) Wr

mongoDB 安装 启动 对文档的增删改操作

把mongodb解压缩完的bin路径加到环境变量 创建a.bat和b.bat文件: a.bat内容: mongod --dbpath F:\MongoData b.bat内容: mongo 127.0.0.1:27017/admin a.bat是启动mongodb服务器,--dbpath用来指定数据的存储路径 b.bat是启动mongo shell(即:js 引擎),admin用来指定哪个数据库 启动a.bat,看到 2014-10-14T22:35:48.734+0800 [initandli

mongodb对数组元素及内嵌文档进行增删改查操作(转)

from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: <!-- lang: js --> { "_id" : "195861", "tags" : [ { "tagId" : NumberLong(766), "optDate" : ISODate(&qu

MongoDB对数组元素及内嵌文档进行增删改查操作

比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: {    "_id" : "195861",    "tags" : [            {                    "tagId" : NumberLong(766),                    "optDate" : ISODate("2013-08-12T15

分布式搜索elasticsearch 索引文档的增删改查 入门

1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/<index>/<type>/[<id>] 其中index.type是必须提供的. id是可选的,不提供es会自动生成. index.type将信息进行分层,利于管理. index可以理解为数据库:type理解为数据表:id相当于数据库表中记录的主键,是唯一的. 2.索引文

文档的增删改查

增加文档: 方法1: db.collection.insert({}) 插入单个文档 db.collection.insertOne({}) 插入当个文档 db.collection.insert([{},{},{}]) 插入多个文档,参数用中括号 db.collection.insertMany([{},{}]) 也是插入多个文档 e.g. db.class0.insert({'name':"Lucy","age":18}) e.q. db.class0.inse

mongodb的学习笔记一(集合和文档的增删改查)

1数据库的增删改查 一.增加一个数据库: use blog-----切换到指定的数据库,如果数据库不存在,则自动创建该数据库(新建的数据库,如果没有存储对应的集合,是不会显示出来的) 二.删除一个数据库 1首先用use 切换到你需要删除的数据库 use test 2然后执行db.dropDatabase()命令 db.dropDatabase() 三.修改一个数据库的名字 db.copyDatabase(fromdb, todb, fromhost) fromdb:源数据库, todb:目标数据

mongodb的安装与增删改查

mongodb是一款分布式的文件存储的数据库,注意这两个词,分布式和文件存储.mongodb支持复制和分片,可以合理的运用空间的大小,也可以达到容灾的目的.另外文件存储也是一个特点,抛弃了传统的表的概念,使用了集合的概念,下面是对应图 另外一个mongodb具有的优势便是其具有一个javascript的shell,你可以在这里使用纯js的语法. 目前mongodb的版本是3.X版本的,其api相对于2.x版本的变化了不少,包括很多常用的增删改查的命令都有所变化. 首先,下载mongodb,然后c