mongodb 创建更新语法
创建文档
向MongoDB插入数据,使用insert,
如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})
这个操作会给 文档 增加 一个"_id",键,并保存在数据库中。
批量插入
如果要插入多个文档,使用批量插入会快一些,批量化插入能传入一个有文档构成的数据给数据库
一次批量插入只是单个的TCP请求,避免了许多零碎的请求带来的开销.由于无需处理大量的消息头,
这样能减少插入时间.每当单个文档发送致数据库时,会有一个头部信息,告诉数据库对指定的集合做
插入操作.用批量插入的话,数据库就不用重复的处理每个文档的这种头部信息了.
当前版本MongoDB消息的最大长度是16M,使用批量插入是有这个限制的.
插入的原理和作用
当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库.数据库解析
BSON,检验是否包含"_id"键并且不超过16M,除此之外,不做别的验证,就只是简单的将文档原样的
存入数据库.这样做的坏处是允许插入无效的数据,好处是能让数据库更加安全,远离注入式攻击.
所有的主流语言的驱动会在传送数据之前进行一些数据的有效性检查(文档是否超长,是否含非utf-8的字符,
是否使用了未知类型).同样也可以启动数据库服务器的时候使用--objcheck选项,这样服务器就会在插入
之前先检验文档结构的有效性,当然这样要牺牲性能.
查看doc文档转化为BSON的大小(以字节为单位),在shell中使用Object.bsonsize(doc)
删除文档
db.users.remove()
会删除users集合的所有文档,但不会删除集合本身,原有的索引也会保留.
remove函数可以接受一个查询文档作为可选参数,给定这个参数,只有符合条件的文档才会被删除.
db.users.remove({"name":"Refactor"})
删除数据的永久性的,不能撤销和恢复.
如果要清除整个集合,直接删除集合(然后重建索引)比删除集合中所有的文档要快.
删除集合:db.drop_collection("users")
更新文档
update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档进行那些更改
更新的操作是原子性的,若两个更新同时发生,先到服务器的先执行,然后执行另一个.最后的更新会显示在数据库
文档替换
更新最简单的就是使用一个新文档来替代匹配的文档,这适用于模式结构发生较大变化的时候.如将下面的文档
{
"name":"refactor",
"friends":20,
enemies:2
}
更改为
{
"name":"refactor",
"relationships":
{
"friends":20,
enemies:2
}
}

使用修改器
通常文档只会有一部分更新,利用原子的"更新修改器",更新修改器是特殊的键,用来指定复杂的更新操作,比如:
调整,增加,删除键,操作数组,操作内嵌文档.
一般网站都有计数器,来记数公有多少人访问,可以使用原子修改器原子性的完成整个功能.如:

"$set"修改器入门
"$set"用来指定一个键的值,如果键不存在,则创建,这对更新模式或者增加用户定义键来说很方便.
如:
db.users.insert(
{
"name":"refactor",
"age":23,
"sex":"male"
}
)
添加喜欢的书籍:
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":"war and peace"}
}
)
db.users.findOne(
{"name":"refactor"}
)
修改喜欢的数据
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":"war and peace2"}
}
)
"$set"可以修改键的数据类型,如果喜欢多本书,
将book键的值变为一个数组
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":["war and peace","war and peace2"]}
}
)
使用"$unset"将键删除,没有要删除的键也不报错
db.users.update(
{
"name":"refactor"
},
{
"$unset":{"book":1}
}
)
使用"$set"修改内嵌文档
db.blog.insert(
{
"title":"refactor's blog",
"Content":"refactor's blog test",
"author":
{
"name":"refactor",
"email":"295240648@163.com"
}
}
)
db.blog.update(
{
"author.name":"refactor"
},
{
"$set":{"author.name":"refactor2"}
}
)
db.blog.findOne(
{
"title":"refactor's blog"
}
)
增加,修改,删除键的时候,应该使用$修改器.一定要使用$开头的修改器来修改键值对.
使用"$inc" 增加和减少
"$inc"用来增加已有键的值,若不存在键,则增加.用于分析数据,因果关系,投票或其他有变化值的地方.
如:
db.users.insert(
{"url":"http://www.cnblogs.com/refactor"}
)
使用"$inc" 增加一个键pageViews,默认值为10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":10000}}
)
使用"$inc"给键pageViews,再增加10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":10000}}
)
使用"$inc"给键pageViews,再减少10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":-10000}}
)
"$inc"和"$set"用法相似,用来增加或减少数字."$inc"只能用于整数,长整数或双精度浮点数.
虽然很多语言能将 null,bool,有数字构成的字符串 转化成 数字,但使用"$inc"仍会报错:

"$inc"键的值也必须为数字.
数组修改器
"$push"和"$pop"只能用于数组.
如果指定的键已存在,"$push"会向已有的数组末尾加入一个元素,如果键不存在,就创建一个新数组.
如:
db.blog.insert(
{
"title":"refactor's blog",
"Content":"refactor's blog test",
"author":
{
"name":"refactor",
"email":"295240648@163.com"
}
}
)
向以上文档中,添加一个包含一个数组的"comment"键,还向 comment 数组push一个评论.
这个数组会自动创建,并加入评论:
db.blog.update(
{"title":"refactor's blog"},
{
$push:
{
"comments":
{
"name":"refactor2",
"content":"nice"
}
}
}
)
还想添加一条评论:
db.blog.update(
{"title":"refactor's blog"},
{
$push:
{
"comments":
{
"name":"refactor3",
"content":"good"
}
}
}
)
如果一个值不在数组里就把它加进去.可以在查询文档时使用"$ne".
使用"$addToSet"
db.users.insert(
{
"userName":"refactor",
"emails":
[
"295240648@163.com",
"295240648@126.com"
]
}
)
向emails添加新地址,用"$addToSet"避免重复
db.users.update(
{"userName":"refactor"},
{
"$addToSet":
{
"emails":"295240648@163.com"
}
}
)
这样"295240648@163.com" 不会插入到emails中
db.users.update(
{"userName":"refactor"},
{
"$addToSet":
{
"emails":"295240648@qq.com"
}
}
)
这样"295240648@qq.com" 会插入到emails中
将"$addToSet"和"$each"一起使用,可以添加不同的值.
db.users.update(
{"userName":"refactor"},
{
"$addToSet":
{
"emails":
{
"$each":
[
"295240648@111.com",
"295240648@112.com",
"295240648@113.com"
]
}
}
}
)
使用"$pop",可以从数组任何一端删除元素.
{$pop:{key:1}}从数组末尾删除一个元素
{$pop:{key:-1}}从数组头部删除一个元素
使用"$pull",可以根据特定条件删除元素,也可以根据位置删除元素
db.users.update(
{"userName":"refactor"},
{
"$pull":
{
"emails":"295240648@111.com"
}
}
)
"$pull"会将所有匹配的部分删掉,对于数组[1,1,2,1]执行pull 1,得到的结果数组是[2]
mongodb 创建更新语法的更多相关文章
- MongoDB创建\更新\删除文档操作
一.插入\创建文档 --当插入一个不存在的文档时,会自己主动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecti ...
- 《mongoDB》基本操作-创建/更新/删除文档
一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo - use db_name; 选择你要操作的集合 > use demo switched to db dem ...
- MongoDb 创建、更新以及删除文档常用命令
mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...
- mongodb常用查询语法
一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...
- Mongodb的基本语法
前段时间工作上面由于没有多少事所以玩了玩mongodb,学习了它的基本语法,然后现在在这里做一个简单的总结. 1.我是在win平台上面,启动的话比较麻烦,所以我就简单的把启动过程做了个批处理文件 启动 ...
- Mongodb与mysql语法比较
Mongodb与mysql语法比较 mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由 ...
- MongoDB 常用查询语法
一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...
- Mongodb创建数据库
基本语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 coderschool ...
- MongoDB 创建数据库
语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 runoob: > ...
随机推荐
- ruby--Hash方法汇总
一.给Hash添加默认值 :h = {1,2,3,4} #=> {1 => 2, 3 => 4} h.default = 7 h[1] ...
- @JsonFormat的导包问题
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")//注解可以以该格式注入格式@JsonFormat(locale="zh& ...
- MVC实用架构设计(三)——EF-Code First(1):Repository,UnitOfWork,DbContext
前言 终于到EF了,实在不好意思,最近有点忙,本篇离上一篇发布已经一个多星期了,工作中的小迭代告一段落,终于有点时间来继续我们的架构设计了,在这里先对大家表示歉意. 其实这段时间我并不是把这个系列给忘 ...
- 在Linux(CentOS 6.6)服务器上安装并配置基于Apache的SVN服务器
#!/bin/bash # # 在Linux(CentOS 6.6)服务器上安装并配置基于Apache的SVN服务器: # # .安装服务 # .创建svn版本库 # .创建svn用户 # .配置sv ...
- 常用Java数据库连接池
概述 在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接.通常,与数据库服务进行通信的网络协议无需由应用程序本身实现,原因有三: 实现复杂度大,需要充分理解和掌握相应的通信协议. ...
- docker 系列 - Docker CheatSheet | Docker 配置与实践清单 (转载)
本文转载自 (https://segmentfault.com/a/1190000016447161), 感谢作者.
- State management(状态管理)
State management https://en.wikipedia.org/wiki/State_management UI控件的状态管理, 例如按钮的灰化.只读.显示隐藏等. 特殊地一个控件 ...
- 机器学习等知识--- map/reduce, python 读json数据。。。
map/ reduce 了解: 简单介绍map/reduce 模式: http://www.csdn.net/article/2013-01-07/2813477-confused-about-map ...
- python笔记---数据基础类型
s = 'laonanHai' s1 = s.capitalize() #首字母大写,其他字母小写 s2 = s.upper() #全部大写 s3 = s.lower() #全部小写 print(s, ...
- webpack 优化
1 优化loader配置 1.1 缩小文件匹配范围(include/exclude) 通过排除node_modules下的文件 从而缩小了loader加载搜索范围 高概率命中文件 module: ...