mongodb学习比较(数据操作篇)
1. 批量插入:
以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销。就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据。对于数据导入而言,我们可以使用mongoimport完成。
2. 数据库清除:
> db.users.remove()
以上命令将会清除users集合中的所有数据,但是不会删除集合本身以及关联的索引。数据删除操作是不可恢复的,一旦删除就物理的删除了。对于全集合清除这种case,一个更为有效的方式是直接删除集合对象本身以及他关联的所有索引,之后再依次重建,如:
> db.one_collection.drop()
3. 数据更新:
如果在执行数据更新时,有多条文档匹配更新条件,为了避免更新后的_id出现重复性冲突,MongoDB将仅更新第一条查询结果,如:
> post1 = { "name": "stephen", "age" : "35"}
{ "name" : "stephen", "age" : "35" }
> post2 = { "name": "stephen", "age" : 36}
{ "name" : "stephen", "age" : 36 }
> db.blog.insert(post1)
> db.blog.insert(post2)
> post3 = { "name" : "stephen", "age": 37}
{ "name" : "stephen", "age" : 37 }
> db.blog.update({"name":"stephen"},post3)
> db.blog.find()
{ "_id" : ObjectId("4fcd7e2e20668578cc1097d8"), "name" : "stephen", "age" : 36 }
{ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 37 }
4. 修改器:
使用修改器进行数据更新是原子的,也是高效的,不同于全部文档更新的是被更新文档的_id不会变化,而文档完全更新则会修改文档的_id,以及相关的索引。
> db.blog.find()
{ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 41 }
{ "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 }
--$inc修改符将匹配条件的文档的age键原子加一,缺省情况下只是更新第一条符合条件的文档。
> db.blog.update({"name":"stephen"},{"$inc":{"age":1}})
> db.blog.find()
{ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 42 }
{ "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 }
--可以通过update函数的最后一个参数来指定更新所有符合条件的文档,如:
> db.blog.update({"name":"stephen"},{"$inc":{"age":1}},true,true)
> db.blog.find()
{ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 43 }
{ "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 39 }
--$set修改符直接修改匹配文档的内容,如果修改的键存在则直接修改,否则新增。
> db.blog.update({"name":"stephen"},{"$set":{"genda":"male"}})
> db.blog.find()
{ "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "genda" : "male", "name" : "stephen" }
--$unset修改符合$set的功能是完全相反的,如:
> db.blog.update({"name":"stephen"},{"$unset":{"genda":"male"}})
> db.blog.find()
{ "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "name" : "stephen" }
--可以通过$set修改符修改嵌套子文档。
> db.blog.find()
{ "_id" : ObjectId("4fcd8e0220668578cc1097db"), "title" : "A Blog Post", "author" : { "name" : "joe", "email" : "joe@ee.com" } }
> db.blog.update({"title":"A Blog Post"},{"$set":{"author.name":"joe schmoe"}})
> db.blog.find()
{ "_id" : ObjectId("4fcd8e0220668578cc1097db"), "author" : { "email" : "joe@ee.com", "name" : "joe schmoe" }, "title" : "A Blog Post" }
5. 数组修改器:
> db.blog.insert({"title":"one blog"})
> db.blog.find()
{ "_id" : ObjectId("4fcd909520668578cc1097dc"), "title" : "one blog" }
--如果其操作的键不存在,则创建新的键值,其值的类型为数组类型。
> log.update({"title":"one blog"}, {"$push": {"comments":{"content":"hello"}}})
> db.blog.findOne()
{
"_id" : ObjectId("4fcd909520668578cc1097dc"),
"comments" : [
{
"content" : "hello"
}
],
"title" : "one blog"
}
--如果$push操作的键值已经存在,且其值为数组类型,该修改符将为该数组添加新的数组元素。
> db.blog.update({"title":"one blog"}, {"$push": {"comments":{"content":"word"}}
> db.blog.findOne()
{
"_id" : ObjectId("4fcd909520668578cc1097dc"),
"comments" : [
{
"content" : "hello"
},
{
"content" : "word"
}
],
"title" : "one blog"
}
> post = {"username":"joe", "emails":["joe@example.com","joe@gmail.com","joe@yahoo.com"]}
{
"username" : "joe",
"emails" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com"
]
}
> db.blog.insert(post)
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"username" : "joe",
"emails" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com"
]
}
--$addToSet适用于数组,如果数组中该元素已经存在,该命令就不做任何操作后返回,否则将新元素插入数组。
> db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@gmail.com"}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"username" : "joe",
"emails" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com"
]
}
> db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@hotmail.com"}
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com"
],
"username" : "joe"
}
--$addToSet和$each的组合可以将数组插入到另外一个数组中。
> db.blog.update({"username":"joe"},{"$addToSet": {"emails":{"$each":["joe@php.net","joe@example.com"]}}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com",
"joe@php.net"
],
"username" : "joe"
}
--$pop从数组中删除一个元素,如参数为1,表示从数组的尾部删除一个元素,如果是-1,则从头部删除。
> db.blog.update({"username":"joe"}, {"$pop":{"emails":1}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@example.com",
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com"
],
"username" : "joe"
}
> db.blog.update({"username":"joe"}, {"$pop":{"emails":-1}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@gmail.com",
"joe@yahoo.com",
"joe@hotmail.com"
],
"username" : "joe"
}
--$pull修改符则是从数据中删除指定的元素
> db.blog.update({"username":"joe"}, {"$pull":{"emails":"joe@yahoo.com"}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@gmail.com",
"joe@hotmail.com"
],
"username" : "joe"
}
--使数组中出现重复的元素,便于后面修改符的功能演示。
> db.blog.update({"username":"joe"}, {"$push": {"emails":"joe@gmail.com"}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@gmail.com",
"joe@hotmail.com",
"joe@gmail.com"
],
"username" : "joe"
}
--在数组中,第一个元素的下标是0,然后依次增长。下面的示例是将数组中下标为1
--(第二个元素)的元素值修改为新值。
> db.blog.update({"username":"joe"}, {"$set":{"emails.1":"joe@example.com"}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@gmail.com",
"joe@example.com",
"joe@gmail.com"
],
"username" : "joe"
}
--有的时候,特别是在修改查询结果的时候,我们无法获知结果文档数组下标,MongoDB
--提供了$定位符表示查询结果的下标。但是该他只更新第一个匹配元素。
> db.blog.update({"emails":"joe@gmail.com"},{"$set":{"emails.$":"joe@hotmail.com"}})
> db.blog.findOne()
{
"_id" : ObjectId("4fd2e468b2ac404941134bed"),
"emails" : [
"joe@hotmail.com",
"joe@example.com",
"joe@gmail.com"
],
"username" : "joe"
}
6. upsert:
upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。
> db.blog.remove()
> db.blog.update({"username":"joe"},{"username":"joe","age":30},true)
> db.blog.findOne()
{
"_id" : ObjectId("4fd2faac576cd9c101ac0f3d"),
"username" : "joe",
"age" : 30
}
下面的示例可以在新增的同时,修改新增后的值。
> db.blog.remove()
> db.blog.update({"count":25},{"$inc":{"count":3}},true)
> db.blog.find()
{ "_id" : ObjectId("4fd2fd59576cd9c101ac0f3e"), "count" : 28 }
save是一个shell函数,可以在文档不存在时插入,存在时更新。upsert也可以完成同样的工作,但是不如save命令方便。
> var x = db.blog.findOne()
> x.count = 40
40
> db.blog.save(x)
> db.blog.findOne()
{ "_id" : ObjectId("4fd2fde4576cd9c101ac0f3f"), "count" : 40 }
7. 返回已更新文档:
可以通过getLastError命令获取更新多个文档时被更新的文档数量。
> db.blog.remove()
> db.blog.insert({"name":"stephen"})
> db.blog.insert({"name":"stephen3"})
> db.blog.insert({"name":"stephen4"})
> db.blog.update({},{"$set":{"name":"liu"}},false,true)
--n:3表示修改的数量为3。
> db.runCommand({getLastError:1})
{
"updatedExisting" : true,
"n" : 3,
"connectionId" : 1,
"err" : null,
"ok" : 1
}
findAndModify可以原子性的修改查询结果,也可以原子性的删除查询结果。
> db.blog.insert({"name":"stephen"})
> db.blog.insert({"name":"stephen2"})
> db.blog.find()
{ "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }
{ "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen2" }
> db.runCommand({"findAndModify":"blog", "query":{"name":"stephen2"},"update":{"$set":{"name":"stephen3"}}})
> db.blog.find()
{ "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }
{ "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen3" }
> runCommand({"findAndModify":"blog", "query":{"name":"stephen3"},"remove":true})
> db.blog.find()
{ "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }
findAndModify命令中每个键对应的值如下:
findAndModify: 字符串类型的集合名称。
query:查询文档,用来检索文档的条件。
sort: 排序结果的条件。
update:修改文档,对所找到的文档执行的更新。
remove:布尔类型,表示是否删除文档。
new:布尔类型,表示返回的是更新前的文档还是更新后的文档。缺省是更新前文档。
update和remove必须有一个存在,也只能有一个存在。如果没有匹配的文档,该命令会返回一个错误。这个命令有些限制,即一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档
mongodb学习比较(数据操作篇)的更多相关文章
- MongoDB学习笔记(数据操作)
1. 批量插入: 以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封 ...
- Redis学习笔记-数据操作篇(Centos7)
一.基本操作 1.插入数据 127.0.0.1:6379> set name cos1eqlg0 OK 这样就在redis中设置了一个key-value键值对 2.查询数据 127.0.0.1: ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- [Python] Python 学习 - 可视化数据操作(一)
Python 学习 - 可视化数据操作(一) GitHub:https://github.com/liqingwen2015/my_data_view 目录 折线图 散点图 随机漫步 骰子点数概率 文 ...
- linux学习之——数据操作:添加与查询
说明: 在linux系统中,利用搭建的服务器,编写两个页面,一个添加信息,一个展现信息: 主要涉及到:php+mysql的操作: 数据添加页面: <html> <head> & ...
- [转]MongoDB学习 C#驱动操作MongoDB
下载驱动 驱动的下载有两种方式:一种是在C#项目中通过NuGet进行安装,另一种是通过下面的链接:https://github.com/mongodb/mongo-csharp-driver/rele ...
- MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)
MongoDB聚合管道 使用聚合管道可以对集合中的文档进行变换和组合. 管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示.聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点 ...
- MongoDB学习笔记——聚合操作之MapReduce
MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...
- MongoDB学习笔记-数据库命令
概念 数据库命令(database command)是一种非常特殊类型的查询.文档的创建.更新.删除及查询都属于数据库命令的范畴,它还包含管理性的任务(比如关闭服务器和克隆数据库).统计数据及执行聚合 ...
随机推荐
- python之docstrinigs
# -*- coding: cp936 -*- #python 27 #xiaodeng #docstrinigs #文档字符串惯例 ''' 1.多行字符串 2.首行以大写字母开始,以句号结束 3.第 ...
- Kafka 配置
安装 解压放到/opt/kafka, 软链一个latest出来, 先要启动zookeeper. 可以使用独立的zookeeper服务, 也可以用kafka自带的, 在lib目录下带了zookeeper ...
- 转:OGRE场景管理器介绍
一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可 ...
- 【laravel5.*】详解laravel中的依赖注入
1.下面这个是自定义的类,钉钉扫码登录web 网页授权OAuth2.0,是一个典型的依赖注入参考示例:
- Dockerfile 构建google-chrom应用
cat Dockerfile.chrome FROM centos MAINTAINER zh******ech.cn ENV LANG en_US.UTF-8 RUN /bin/cp /usr/sh ...
- 如何在 CentOS 7 中安装或升级最新的内核
虽然有些人使用 Linux 来表示整个操作系统,但要注意的是,严格地来说,Linux 只是个内核.另一方面,发行版是一个完整功能的系统,它建立在内核之上,具有各种各样的应用程序工具和库. 在正常操作期 ...
- Linux-配置虚拟IP
Linux下配置网卡ip别名何谓ip别名?用windows的话说,就是为一个网卡配置多个ip.什么场合增加ip别名能派上用场?布网需要.多ip访问测试.特定软件对多ip的需要...and so on. ...
- java计算时间差, 日期差小结
转自:https://blog.csdn.net/sy793314598/article/details/79544796 1.java 7中的日历类Calendar Calendar类使用其静态的g ...
- ajax, jQuery, jQueryeasyUI
1.ajax与jQueryajax是jquery库里面的一个被封装好的函数,可以拿来直接使用.没有jquery的话,ajax的使用就得用原生的javascript去写,比较麻烦. 2.jQuery E ...
- “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 想做一个面对中小企业的专业上游软件供应商 台湾联发科技颠覆掉的是一个封闭的手机产业系统 解决方案,即AgileHIS.NET数字化医院基础方案
“医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 我们做中国医疗信息化行业之中的联发科 ---我们在医疗行业中的定位及目标 从我个人来讲,我从2001年到现在这10年之间基本上一直在 ...