插入insert

单条插入

> db.foo.insert({"bar":"baz"})
WriteResult({ "nInserted" : })

批量插入

> db.foo.insert([{"_id":},{"_id":},{"_id":}])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : ,
"nUpserted" : ,
"nMatched" : ,
"nModified" : ,
"nRemoved" : ,
"upserted" : [ ]
})
> db.foo.find()
{ "_id" : }
{ "_id" : }
{ "_id" : }
>

如果在执行批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会插入成功,之后的所有全部失败。

> db.foo.insert([{"_id":},{"_id":},{"_id":},{"_id":}])
BulkWriteResult({
"writeErrors" : [
{
"index" : ,
"code" : ,
"errmsg" : "E11000 duplicate key error collection: test.foo index: _id_ dup key: { : 10.0 }",
"op" : {
"_id" :
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : ,
"nUpserted" : ,
"nMatched" : ,
"nModified" : ,
"nRemoved" : ,
"upserted" : [ ]
})
> db.foo.find()
{ "_id" : }
{ "_id" : }
>

删除文档

remove

remove函数接受一个查询文档作为参数。符合条件的文档才被删除。删除数据是永久性的,不能撤销,也不能恢复。

> db.foo.remove()
--15T19::31.721+ E QUERY [thread1] Error: remove needs a query :
DBCollection.prototype._parseRemove@src/mongo/shell/collection.js::
DBCollection.prototype.remove@src/mongo/shell/collection.js::
@(shell):: > db.foo.remove({"_id":})
WriteResult({ "nRemoved" : })
> db.foo.find()
{ "_id" : }
>

drop

要清空整个集合,那么使用drop直接删除集合会更快。代价是:不能指定任何限定条件。整个集合都被删除,所有元数据都不见了。

> for(var i=;i<;i++){
... db.tester.insert({"foo":"bar","baz":i,"z":-i})
... }
WriteResult({ "nInserted" : })
> db.tester.find()
{ "_id" : ObjectId("58528543b049609a5fa74f7c"), "foo" : "bar", "baz" : , "z" : }
......
Type "it" for more
> db.tester.drop()//插入一百万条数据,使用drop删除,只需1ms
true
>

更新文档update

Update有两个必须参数:

一是查询文档,用于定位需要更新的目标文档

二是修改器文档,用于说明要找到的文档进行哪些修改

更新操作是不可分割的:若是两个更新同时发生,先到达服务器的先执行,接着执行另一个。

db.foo.insert({
... "name":"yyb",
... "friends":,
... "enemies":
... })
WriteResult({ "nInserted" : })
> db.foo.update({"name":"yyb"},{"name":"joe"})//将yyb这个文档修改成{“name”:“joe”}
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.foo.find()
{ "_id" : ObjectId("58528a2bb049609a5fb691bc"), "name" : "joe" }
>

文档替换

用一个新文档完全替换匹配的文档,这适合大规模模式迁移的情况。

  db.user.insert({
... ... "name":"joe",
... ... "friends":,
... ... "enemies":
... ... })
WriteResult({ "nInserted" : })
//将上面这个文档的后两个字段移到子文档为realtionships中
> var joe=db.user.findOne({"name":"joe"})
> joe.relationships={"friends":joe.friends,"enemies":joe.enemies};
{ "friends" : , "enemies" : }
> delete joe.friends
true
> delete joe.enemies
true
> db.user.update({"name":"joe"},joe);
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.user.find()
{ "_id" : ObjectId("58529188b049609a5fb691bf"), "name" : "joe", "relationships" : { "friends" : , "enemies" : } }
>

常见的错误是查询条件匹配到了多个文档,然后更新时由于第二个参数的存在就产生重复的 _id 值。数据库会抛出异常。

> db.user.find()
{ "_id" : ObjectId("585295e3b049609a5fb691c5"), "name" : "yyb", "age" : }
{ "_id" : ObjectId("585295e3b049609a5fb691c6"), "name" : "yyb", "age" : }
{ "_id" : ObjectId("585295e3b049609a5fb691c7"), "name" : "yyb", "age" : }
> joe=db.user.findOne({"name":"yyb","age":})
{ "_id" : ObjectId("585295e3b049609a5fb691c6"), "name" : "yyb", "age" : }
> joe.age++; > db.user.update({"name":"yyb"},joe)
WriteResult({
"nMatched" : ,
"nUpserted" : ,
"nModified" : ,
"writeError" : {
"code" : ,
"errmsg" : "The _id field cannot be changed from {_id: ObjectId('585295e3b049609a5fb691c5')} to {_id: ObjectId('585295e3b049609a5fb691c6')}."
}
})
>

使用修改器

使用原子性的更新修改器,指定对文档的某些字段进行更新。更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、添加或者删除键,还可能是操作数组或者内嵌文档。

> db.user.find()
{ "_id" : ObjectId("585295e3b049609a5fb691c5"), "name" : "yyb", "age" : }
{ "_id" : ObjectId("585295e3b049609a5fb691c6"), "name" : "yyb", "age" : }
{ "_id" : ObjectId("585295e3b049609a5fb691c7"), "name" : "yyb", "age" : }
> db.user.update({"name":"yyb"},{$inc:{"age":}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })> db.user.find({"name":"yyb"})
{ "_id" : ObjectId("585295e3b049609a5fb691c5"), "name" : "yyb", "age" : }
{ "_id" : ObjectId("585295e3b049609a5fb691c6"), "name" : "yyb", "age" : }
{ "_id" : ObjectId("585295e3b049609a5fb691c7"), "name" : "yyb", "age" : }
>

明明匹配3条,却只改了一条。原来MongoDB默认只会更新匹配的第一条,如果要更新多条,还得指定参数。

使用修改器时,_id的值不能改变。(整个文档替换时可以改变“_id”)

$set与$unset

用来指定一个字段的值。如果这个字段不存在,则创建它。

> db.user.insert({
... "name":"yyb",
... "age":,
... "sex":"male",
... "location":"cd"})
WriteResult({ "nInserted" : })
>> db.user.update({"name":"yyb"},{"$set":{"email":"123@qq.com"}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.user.find().pretty()
{
"_id" : ObjectId("58529e66b049609a5fb691c9"),
"name" : "yyb",
"age" : ,
"sex" : "male",
"location" : "cd",
"email" : "123@qq.com"
}
>

用 $set 甚至可以修改键的类型。用 $unset 可以将键完全删除。

>  db.user.update(
... ... {"name":"yyb"},
... ... {"$set":{"email":["xx@qq.com","xl@sina.com"]}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.user.find().pretty()
{
"_id" : ObjectId("58529e66b049609a5fb691c9"),
"name" : "yyb",
"age" : ,
"sex" : "male",
"location" : "cd",
"email" : [
"xx@qq.com",
"xl@sina.com"
]
}
> db.user.update({"name":"yyb"},{"$unset":{"email":}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.user.find().pretty()
{
"_id" : ObjectId("58529e66b049609a5fb691c9"),
"name" : "yyb",
"age" : ,
"sex" : "male",
"location" : "cd"
}

也可以用 $set 修改内嵌文档:

{
"_id" : ObjectId("5853e17ff7720722b4ded850"),
"title" : "a blog post",
"content" : "...",
"author" : {
"name" : "yyb",
"email" : "aaa@sina.com"
}
}
> db.blog.update(
... {"author.name":"yyb"},
... {"$set":{"author.name":"joe"}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.blog.findOne()
{
"_id" : ObjectId("5853e17ff7720722b4ded850"),
"title" : "a blog post",
"content" : "...",
"author" : {
"name" : "joe",
"email" : "aaa@sina.com"
}
}

增加、删除、修改键时,应该使用$开头的修改器,否则可能会将整个文档替换掉。

$inc

$inc 用来增加已有键的值,或者该键不存在那就创建一个。对于更新分析数据、因果关系、投票或者其他有变化数值的地方很方便。

> db.games.insert({"games":"pinball","user":"joe"})
WriteResult({ "nInserted" : })
> db.games.update({"games":"pinball"},{"$inc":{"score":}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.games.findOne()
{
"_id" : ObjectId("5853e517f7720722b4ded851"),
"games" : "pinball",
"user" : "joe",
"score" :
}
> db.games.update({"games":"pinball"},{"$inc":{"score":}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.games.findOne()
{
"_id" : ObjectId("5853e517f7720722b4ded851"),
"games" : "pinball",
"user" : "joe",
"score" :
}
>

$inc 就是专门用来增减数字的。且只能用于整型、长整型或者双精度浮点型的值。其他类型的数据会操作失败。

> db.foo.insert({"count":""})
WriteResult({ "nInserted" : }) > db.foo.update({},{"$inc":{"count":}})
WriteResult({
"nMatched" : ,
"nUpserted" : ,
"nModified" : ,
"writeError" : {
"code" : ,
"errmsg" : "Cannot apply $inc to a value of non-numeric type. {_id: ObjectId('5853e73df7720722b4ded853')} has the field 'count' of non-numeric type String"
}
})
>

$inc 键的值必须为数字”,不能使用字符串、数组或者其他非数字的值。要修改其他类型,应该使用 $set 或者数字修改器。

> db.foo.insert({"count":})
WriteResult({ "nInserted" : }) > db.foo.update({},{"$inc":{"count":""}})
WriteResult({
"nMatched" : ,
"nUpserted" : ,
"nModified" : ,
"writeError" : {
"code" : ,
"errmsg" : "Cannot increment with non-numeric argument: {count: \"5\"}"
}
})
>

数组修改器

$push

$push 添加元素。如果数组已经存在,会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。

> db.blog.post.findOne()
{
"_id" : ObjectId("5853ea01f7720722b4ded855"),
"title" : "a blog post",
"content" : "..."
}
> db.blog.post.update(
... {"title":"a blog post"},
... {"$push":{"comments":{"name":"joe","email":"joe@qq.com","content":"nice post"}}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.blog.post.findOne()
{
"_id" : ObjectId("5853ea01f7720722b4ded855"),
"title" : "a blog post",
"content" : "...",
"comments" : [
{
"name" : "joe",
"email" : "joe@qq.com",
"content" : "nice post"
}
]
}
>
> db.blog.post.update(
... {"title":"a blog post"},
... {"$push":{"comments":{"name":"bob","email":"bob@sina.com","content":"good post."}}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.blog.post.findOne()
{
"_id" : ObjectId("5853ea01f7720722b4ded855"),
"title" : "a blog post",
"content" : "...",
"comments" : [
{
"name" : "joe",
"email" : "joe@qq.com",
"content" : "nice post"
},
{
"name" : "bob",
"email" : "bob@sina.com",
"content" : "good post."
}
]
}
>

$each

可以将它应用在一些比较复杂的数组操作中。使用 $each 子操作符,可以通过一次 $push 操作添加多个值。

比如:下面将三个新元素添加到数组中。如果指定的数组中只包含一个元素,那么等同于和没有使用“$each”的普通的“$push”操作。

db.stock.ticket.insert({"_id":"goog"})
WriteResult({ "nInserted" : })
> db.stock.ticket.update(
... ... ... {"_id":"goog"},
... ... ... {"$push":{"hourly":{"$each":[562.776,562.790,559.123]}}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.stock.ticket.findOne()
{ "_id" : "goog", "hourly" : [ 562.776, 562.79, 559.123 ] }

要实现上面的操作,下面方法也可以。

db.stock.ticket.update(
... ... ... ... ... {"_id":"goog"},
... ... ... ... ... {"$set":{"hourly":[562.776,562.790,559.123]}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.stock.ticket.findOne()
{ "_id" : "goog", "hourly" : [ 562.776, 562.79, 559.123 ] }

而下面这样是不行的

 db.stock.ticket.update(
... ... ... ... {"_id":"goog"},
... ... ... ... {"$push":{"hourly":[562.776,562.790,559.123]}})
WriteResult({ "nMatched" : , "nUpserted" : , "nModified" : })
> db.stock.ticket.findOne()
{ "_id" : "goog", "hourly" : [ [ 562.776, 562.79, 559.123 ] ] }

MongoDB学习笔记三—增删改文档上的更多相关文章

  1. MongoDB学习笔记四—增删改文档下

    $slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为 ...

  2. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

  3. MongoDB学习笔记—03 增删改查操作

    MongoDB的CURD操作分别通过函数insert().update().find().remove()进行 MongoDB文档新增与删除 MongoDB中关于文档的新增与删除比较简单.主要通过in ...

  4. SpringBoot学习笔记:Swagger实现文档管理

    SpringBoot学习笔记:Swagger实现文档管理 Swagger Swagger是一个规范且完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.Swagger的目标是对RE ...

  5. MongoDB学习-->命令行增删改查&JAVA驱动操作Mongodb

    MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关 ...

  6. MongoDB学习笔记三 - MongooseAPI操作数据

    在上一篇我们讲了如何通过Mongoose想数据库动态添加数据, 接下来我们一起来看一下如何通过Mongoose来对数据库进行增删改查等一系列操作 Model 对象的方法 remove(cinditio ...

  7. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  8. 3、MyBatis.Net学习笔记之增删改

    增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题. <resultMaps> <resultMap id="FullResultMap" ...

  9. MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

随机推荐

  1. 前端开发中SEO的十二条总结

    一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...

  2. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  3. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  4. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  5. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  6. 【C#公共帮助类】 Utils 10年代码,最全的系统帮助类

    为大家分享一下个人的一个Utils系统帮助类,可能有些现在有新的技术替代,自行修改哈~ 这个帮助类主要包含:对象转换处理 .分割字符串.截取字符串.删除最后结尾的一个逗号. 删除最后结尾的指定字符后的 ...

  7. [修正] Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在)

    问题:Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在) 解决:(暂时方法) type TTestFrame = class(TFrame) public const ...

  8. BPM流程中心解决方案分享

    一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...

  9. Android菜单项内容大全

    一.介绍: 菜单是许多应用中常见的用户界面组件. Android3.0版本以前,Android设备会提供一个专用"菜单"按钮呈现常用的一些用户操作, Android3.0版本以后, ...

  10. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...