韦德国际1946英国 > 计算机网络 > 计算机网络:删除和更新,增删改文档上

原标题:计算机网络:删除和更新,增删改文档上

浏览次数:91 时间:2019-05-25

$push

$push 添美元素。借使数组已经存在,会向已有个别数组末尾加入3个成分,假诺未有就创建二个新的数组。

> 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" : 1, "nUpserted" : 0, "nModified" : 1 })
> 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" : 1, "nUpserted" : 0, "nModified" : 1 })
> 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."
                }
        ]
}
> 

3."$push"修改器

"$push"修改器能够向数组的终极参预三个要素,借使钦赐的键不设有,就能成立2个新数组,并把要插入的因素插入。

 db.user.update({name:"jun12"},{$push:{tel:12345678902}})

地方的命令会在name为jun1二的文书档案的tel键上插入贰个要素1234567890二,如果tel键不设有,就创立tel键,并出插入成分。

详见如下图

计算机网络 1

假定要添扩张条,能够利用$pushAll,代码如下

db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $pushAll: {tel : [15155555555,13133334343]}});

$inc

 $inc 用来增加已有键的值,或许该键不设有那就创立三个。对于革新分析数据、因果关系、投票可能别的有生成数值的地点很有益于。

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

 $inc 就是极度用来增减数字的。且不得不用于整型、长整型可能双精度浮点型的值。其余品类的数据会操作战败。

> db.foo.insert({"count":"1"})
WriteResult({ "nInserted" : 1 })

> db.foo.update({},{"$inc":{"count":1}})
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 16837,
                "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":1})
WriteResult({ "nInserted" : 1 })

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

1.文书档案替换

db.user.update({"_id":ObjectId("52d791307ae252f9149547c9")},jun)

将_id为ObjectId("52d79130七ae25二f91495四7c九")的文书档案更新为jun,jun是二个object。

详细如下图

计算机网络 2

先将寻觅的多少复制给jun变量,修改name属性,在选取命令db.user.update({"_id":ObjectId("52d791307ae25二f9149547c玖")},jun)在数据库中立异。当update时,数据库会去索求2个_id为ObjectId("52d791307ae25二f91495四7c玖")的文书档案,并替换它。update时最佳使用_计算机网络:删除和更新,增删改文档上。id。

单条插入

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

2."$inc"修改器 

"$inc"修改器能够用来充实已有键的值,大概在建不设不时创制一个键。

db.user.update({"name":"jun12"},{"$inc":{"score":100}})

地点的命令会在name为jun12的文书档案的score键上加100,若是score键不存在,就创办score键,并把值设置为扩大量100。

详尽如下图

计算机网络 3

"$inc"只好用于整数、长整数或双精度浮点数,不唯有其后的值,而且要翻新的键值也要满意。假若用在任何品种的数量上就能够招致操作退步。个中包括过多语言会活动转换到数字的花色,比如null、布尔类型或数字组成的字符串。"$inc"特地用来扩展或减少(数字为负数)数字的。

remove

remove函数接受三个询问文档作为参数。符合条件的文书档案才被去除。删除数据是永世性的,不可能收回,也不可能还原。

> db.foo.remove()
2016-12-15T19:50:31.721 0800 E QUERY    [thread1] Error: remove needs a query :
DBCollection.prototype._parseRemove@src/mongo/shell/collection.js:406:1
DBCollection.prototype.remove@src/mongo/shell/collection.js:433:18
@(shell):1:1

> db.foo.remove({"_id":10})
WriteResult({ "nRemoved" : 1 })
> db.foo.find()
{ "_id" : 11 }
> 

去除文书档案

db.user.remove()

地点的命令会删除user集结中的文书档案,但不会删除user集结自己,索引也会保留。

remove函数还可以多少个查询作为可选参数。给定参数之后,只有符合条件的文书档案才会被去除。

db.user.remove({"name":"jun"})

上面包车型大巴命令会删除user集结中name为jun的文书档案。如下图所示:

计算机网络 4

剔除数据是永久的,不能够裁撤也不可能回复。

批量安排

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

万壹在施行批量陈设的经过中有3个文书档案插入退步,那么在那个文书档案在此以前的具有文书档案都会插入成功,之后的持有1切退步。

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

改进三个文书档案

暗中认可境况下更新只针对第二个特别的文书档案施行,若要使具有相称的文书档案都更新,只需安装update的第五个参数为true。

db.blog.update(
  {"visit":1},
  {"inc":{"visit":1}},
  false, true)

$each

能够将它应用在有个别相比较复杂的数组操作中。使用 $each 子操作符,能够通过一回 $push 操作增添几个值。

举个例子:上面将四个新因素增多到数组中。要是钦点的数组中只包罗八个成分,那么等同和尚未选择“$each”的平常的“$push”操作。

db.stock.ticket.insert({"_id":"goog"})
WriteResult({ "nInserted" : 1 })
>  db.stock.ticket.update(
... ... ... {"_id":"goog"},
... ... ... {"$push":{"hourly":{"$each":[562.776,562.790,559.123]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> 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" : 1, "nUpserted" : 0, "nModified" : 1 })
> 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" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stock.ticket.findOne()
{ "_id" : "goog", "hourly" : [ [ 562.776, 562.79, 559.123 ] ] }

 

作者动用的是MongoDB 2.4.八

数组修改器

findAndModify

持有类似事情脾气的更新与查询操作。它是原子性的,会回来符合查询条件的翻新后的文档。

一遍只好管理贰个文书档案,约等于规则query条件,且施行sort后的率先个文书档案。

比更新要慢,差不离耗时也就是一回找寻、一回立异和三次getLastError顺序实践所需的年华。

db.COLLECTION_NAME.findAndModify({query:{}, update:{}, remove:true|false, new:true|false, sort:{}, fields:{}, upsert:true|false});

query是询问采纳器,与findOne的查询采取器同样

update是要立异的值,无法与remove同期出现

remove代表删除符合query条件的文书档案,不可能与update同不经常间出现

new为true:再次回到更新后的文书档案,false:重回更新前的,私下认可是false

sort:排序条件,与sort函数的参数1致。

田野先生s:投影操作,与find*的第二个参数1致。

upsert:与update的upsert参数一样。

 

利用findAndModify可以落到实处的效应如下:

  1. 检索并立异

  2. 搜索并剔除

  3. 探索,存在就立异,不设有就插入一条

 

前几天就先到此处该去就餐了

 

drop

要清空整个集合,那么使用drop直接删除集结会越来越快。代价是:不能够内定其余限制规范。整个集合都被去除,全数元数据都遗落了。

> for(var i=0;i<1000000;i  ){
... db.tester.insert({"foo":"bar","baz":i,"z":10-i})
... }
WriteResult({ "nInserted" : 1 })
> db.tester.find()
{ "_id" : ObjectId("58528543b049609a5fa74f7c"), "foo" : "bar", "baz" : 0, "z" : 10 }
......

Type "it" for more
> db.tester.drop()//插入一百万条数据,使用drop删除,只需1ms
true
>

upsert操作

upsert是1种特有的换代。假诺未有文书档案符合更新标准,就能以那么些原则和翻新文书档案为底蕴成立1个新的文书档案。假诺找到了合营的文书档案,则正常更新。

其命令正是将update的第二个参数设为true。

db.blog.update(
  {"url":"/blog"},
  {"inc":{"visit":1}},
  true)

upsert是原子性的,比起查询出来,判别是不是存在,再决定加多如故修改要高效的多。

剔除文书档案

8."$"修改器

若数组有八个值,大家只想对个中一些进行操作,就要求用地点依旧定位操作符"$"。

db.blog.update(
  {"comments.author":"jun"},
  {"$set":{"comments.$.author":"harry"}}    
)

定点符职相称第3个,会将jun的首先个评价的名字修改为harry。

插入insert

1."$set"修改器

"$set"是用来设置3个键的值的,假诺这么些键不存在,就创办它。

db.user.update({"name":"jun12"},{"$set":{"email":"jun@126.com"}})

运用$set修改器向name为jun1二的文书档案里丰富或涂改键email为jun@126.com

详尽如下图

计算机网络 5 

若是采纳如下命令

db.user.update({"name":"jun12"},{"email":"jun@126.com"})

会将name为jun1二的文档替换为文书档案{"email":"jun@1贰六.com"},就一定于前方的文书档案替换。

若是要刨除1个key就动用相应的$unset

db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $unset: {"email" : 1}});

奉行完那条命令后,_id是ObjectId('5四deeacc2736e7四e05八b456八')的文书档案里就能够移除email的key。

使用修改器

采纳原子性的换代修改器,钦赐对文书档案的少数字段进行翻新。更新修改器是种特殊的键,用来内定复杂的翻新操作,举个例子修改、增加或许删除键,还可能是操作数组只怕内嵌文书档案。

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

明明相称三条,却只改了一条。原来MongoDB默许只会更新匹配的首先条,假如要更新多条,还得钦点参数。

选取修改器时,_id的值不能改换。(整个文书档案替换时能够退换“_id”)

5."$each"修改器

"$each"用来循环,与"$addToSet"结合使用,能够不重复的插入多少个要素。

db.user.update(
  {_id:ObjectId("52d791327ae252f9149547cb")},
  {$addToSet:{tel:{$each:[12345678903,12345678904,12345678905]}}}
)

 详细如下图

计算机网络 6

本文由韦德国际1946英国发布于计算机网络,转载请注明出处:计算机网络:删除和更新,增删改文档上

关键词: MongoDB NoSQL

上一篇:浏览器仿EXCEL表格插件,没想到Excel如此简单

下一篇:没有了