文档章节

Mongodb语法学习:更新

贾峰uk
 贾峰uk
发布于 2017/08/31 01:14
字数 1133
阅读 7
收藏 0

字段更新操作符

1. $set:用来指定一个键的值。如果这个键不存在,则创建它。

添加例子:

首先添加一条数据:

db.posts.insert({"name":"sean","age":33,"sex":"male"})
> db.posts.find({"name":"sean"})
{ "_id" : ObjectId("59a6df85a95c5eb6f7267c00"), "name" : "sean", "age" : 33, "sex" : "male" }

执行更新语句:
 

db.posts.update({"_id":ObjectId("59a6df85a95c5eb6f7267c00")},{"$set":{"hobby":"reading"}})
> db.posts.find({"_id":ObjectId("59a6df85a95c5eb6f7267c00")})
{ "_id" : ObjectId("59a6df85a95c5eb6f7267c00"), "name" : "sean", "age" : 33, "sex" : "male", "hobby" : "reading" }

通过查询我们发现已经添加成功。在update语句中我们发现有两组参数,第一组相当于查询条件及要更新的数据必须满足的条件,第二组数据是我们的操作更新hobby属性,因为源数据中没有改属性则新增。

mongodb中的更新操作和关系数据库中更新不同,mongodb更新的属性值可以与源属性值不同类型的数据。可以更新为数组、文档、不同类型数据等等。

> db.posts.update({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")},{"$set":{"sex":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"_id":ObjectId("59a6df85a95c5eb6f7267c00")})
{ "_id" : ObjectId("59a6df85a95c5eb6f7267c00"), "name" : "sean", "age" : 33, "sex" : 1, "hobby" : "reading" }
> db.posts.update({"_id":ObjectId("59a6df85a95c5eb6f7267c00")},{"$set":{"hobby":["reading","runing","playing"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"_id":ObjectId("59a6df85a95c5eb6f7267c00")});
{ "_id" : ObjectId("59a6df85a95c5eb6f7267c00"), "name" : "sean", "age" : 33, "sex" : 1, "hobby" : [ "reading", "runing", "playing" ] }

通过update语句还可以更新(没有时添加)内嵌文档属性:

db.posts.update({"_id":ObjectId("59a6df85a95c5eb6f7267c00")},{"$set":{"author.name":"sean","author.age":22}})
db.posts.find({"_id":ObjectId("59a6df85a95c5eb6f7267c00")}).pretty()
{
	"_id" : ObjectId("59a6df85a95c5eb6f7267c00"),
	"name" : "sean",
	"age" : 33,
	"sex" : 1,
	"hobby" : [
		"reading",
		"runing",
		"playing"
	],
	"author" : {
		"name" : "sean",
		"age" : 22
	}
}

2. $unset:从文档中移除指定属性

执行语句之后发现hobby属性已经被移除。

db.posts.update({"_id":ObjectId("59a6df85a95c5eb6f7267c00")},{"$unset":{"hobby":0}})
> db.posts.find({"_id":ObjectId("59a6df85a95c5eb6f7267c00")}).pretty()
{
	"_id" : ObjectId("59a6df85a95c5eb6f7267c00"),
	"name" : "sean",
	"age" : 33,
	"sex" : 1,
	"author" : {
		"name" : "sean",
		"age" : 22
	}
}

3. $inc :修改器用来增加已有键的值,或者在键不存在时创建一个键。inc"修改器用来增加已有键的值,或者在键不存在时创建一个键。inc就是专门来增加(和减少)数字的。"$inc"只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败。

如下面例子:我们给前面添加数据的作者增加一岁

 db.posts.update({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")},{"$inc":{"author.age":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")}).pretty()
{
	"_id" : ObjectId("59a6df85a95c5eb6f7267c00"),
	"name" : "sean",
	"age" : 33,
	"sex" : 1,
	"author" : {
		"name" : "sean",
		"age" : 23
	}
}

4. $rename

语法: {$rename: { <old name1>: <new name1>, <old name2>: <new name2>, ... } }

$rename操作符可以重命名字段名称,新的字段名称不能和文档中现有的字段名相同。如果文档中存在A、B字段,将B字段重命名为A,$rename会将A字段和值移除掉,然后将B字段名改为A。

下面例子,既可以修改文档属性名也可以修改子文档属性名

> db.posts.update({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")},{"$rename":{"age":"num","author.age":"author.num"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")}).pretty()
{
	"_id" : ObjectId("59a6df85a95c5eb6f7267c00"),
	"name" : "sean",
	"sex" : 1,
	"author" : {
		"name" : "sean",
		"num" : 23
	},
	"num" : 33
}

$rename也可以将子文档A的属性移到子文档B的中

db.posts.update({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")},{"$rename":{"author.num":"house.num"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"_id" : ObjectId("59a6df85a95c5eb6f7267c00")}).pretty()
{
	"_id" : ObjectId("59a6df85a95c5eb6f7267c00"),
	"name" : "sean",
	"sex" : 1,
	"author" : {
		"name" : "sean"
	},
	"num" : 33,
	"house" : {
		"num" : 23
	}
}

5. upsert :upset不是一个操作符,他是update的第三个参数,是一个booleen类型,默认为false。当我们赋值为true时,就表示,如果更新的数据不存在我们就按照条件创建一个,然后再进行更新操作。

> db.posts.update({"name":"gaoqiumin"},{"$set":{"age":30}},true)
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 1,
	"nModified" : 0,
	"_id" : ObjectId("59a6ee7d6441b73551275b5f")
})
> db.posts.find({"name":"gaoqiumin"}).pretty()
{
	"_id" : ObjectId("59a6ee7d6441b73551275b5f"),
	"name" : "gaoqiumin",
	"age" : 30
}

更新的值不存在,然后我们新建了该文档,然后进行更新。

6. $setOnInsert:操作符,当upsert为true时,该操作符为新创建的文档添加属性。

> db.posts.update({"name":"wangxiaofang"},{"$setOnInsert":{"age":33,"com":"shanghah"}},true)
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 1,
	"nModified" : 0,
	"_id" : ObjectId("59a6efb26441b73551275b78")
})
> db.posts.find({"name":"wangxiaofang"}).pretty()
{
	"_id" : ObjectId("59a6efb26441b73551275b78"),
	"name" : "wangxiaofang",
	"age" : 33,
	"com" : "shanghah"
}

当条件查询的文档已经存在就不会添加$setOnInsert操作符的内容,且不影响$set操作符操作。

> db.posts.update({"name":"wangxiaofang"},{"$setOnInsert":{"city":"zhengzhou"},"$set":{"age":25}},true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"name":"wangxiaofang"}).pretty()
{
	"_id" : ObjectId("59a6efb26441b73551275b78"),
	"name" : "wangxiaofang",
	"age" : 25,
	"com" : "shanghah"
}

7. $push:向已有的数组末尾添加元素

db.posts.find({"title":"MongoDB"}).pretty()
{
	"_id" : ObjectId("59a6f2576441b73551275bb6"),
	"title" : "MongoDB",
	"comments" : [
		{
			"name" : "egger",
			"content" : "thks!"
		}
	]
}
> db.posts.update({"title":"MongoDB"},{$push:{"comments":{"name":"redis","content":"doit"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.find({"title":"MongoDB"}).pretty()
{
	"_id" : ObjectId("59a6f2576441b73551275bb6"),
	"title" : "MongoDB",
	"comments" : [
		{
			"name" : "egger",
			"content" : "thks!"
		},
		{
			"name" : "redis",
			"content" : "doit"
		}
	]
}

8. $pull :移除数组中匹配规则的值

db.profiles.insert({ votes: [ 3, 5, 6, 7, 7, 8 ] });
//移除数组中所有元素7
db.profiles.update( { votes: 3 }, { $pull: { votes: 7 } } );
//Result
{ votes: [ 3, 5, 6, 8 ] }

//移除数组中所有大于6的元素
db.profiles.update( { votes: 3 }, { $pull: { votes: { $gt: 6 } } } );
{ votes: [ 3, 5, 6 ] }

 

© 著作权归作者所有

贾峰uk
粉丝 2
博文 106
码字总数 164841
作品 0
深圳
私信 提问
【本人秃顶程序员】MongoDB是个好东西,希望你也会

←←←←←←←←←←←← 快!点关注 1、MongoDB是什么? MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库 2、为什么要用M...

本人秃顶程序员
01/31
0
0
MongoDB学习心得(整理中)

NoSQL(Not Only SQL)-非关系型数据库,又一种流行的数据库技术。除去复杂、臃肿的结构化语言,简单的几个函数就可以完成增删该处基本操作。NoSQL好比一个灵活的猴子,而SQL就像大笨象了。 ...

cjp路人
2013/11/03
0
0
MongoDB学习之路——基础

一、相关概念 MongoDB中没有表和记录的概念,也不支持外键、事务、数据类型约定等,MongoDB中的表是集合(Collection),记录是文档(Document),MongoDB中一个数据库包含多个集合,一个集合包含...

luckintt
06/13
0
0
mongodb想速成吗,这个系列教程你可以看看(1)

1、mongodb简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性...

lio-mengxiang
04/09
0
0
MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码 先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroadlee/MongoDBDemo.rar 此项目是用Mav...

Airship
2018/10/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
43
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
6
0
Nginx提供下载apk服务

有时候我们可能需要提供文件或者其他apk下载链接,通过 nginx 配置可以很简单地实现。 server {    listen 80;    server_name download.xxx.com;    root app;    locati...

Jack088
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部