MongoDB 深入更新数据
MongoDB 深入更新数据:在MongoDB中是没有事务的概念的,因此会以最后写入的数据为准的,也即所谓的乐观并发控制,基于同一个文档基本上不会被同时修改这一预测上的,而这一预测相对于需要保持严格一致性的事务机制来讲,这一预测正是其乐观所在。虽然它没有事务机制,但支持原子操作和乐观并发控制,而原子操作的名称都是以“$”开头的,下面将会给你介绍在update方法里的原子操作,包括 $inc、 $set、 $unset、 $push、$pushAll、$addToSet、$pop、$pull、$pullAll。
先插入一些测试用的数据
>db.things.insert({x:0, y:0})
>db.things.insert({x:0, y:1})
>db.things.insert({x:0, y:2})
>db.things.insert({x:1, y:0})
>db.things.insert({x:1, y:1})
>db.things.insert({x:1, y:2})
原子操作分析:
* $inc
功能:对指定字段做增减数值操作
说明:增加值用正数,降低值用负数
例子1:找出j为0的文档(符合条件的第一个文档),并将该文档的x字段增加1
>db.things.update({j: 0}, {$inc: {x: 1}})
>db.things.find()
结果:(为方便观察,我省略了"_id"属性)
{ "j": 0, "x": 1 }
{ "j": 0, "x": 1 }
{ "j": 0, "x": 2 }
{ "j": 1, "x": 0 }
{ "j": 1, "x": 1 }
{ "j": 1, "x": 2 }
例子2:找出j为0的文档(符合条件的第一个文档),并将该文档的x字段减2
>db.things.update({j: 0}, {$inc: {x: -2}})
>db.things.find()
结果:
{ "j": 0, "x": -1 }
{ "j": 0, "x": 1 }
{ "j": 0, "x": 2 }
{ "j": 1, "x": 0 }
{ "j": 1, "x": 1 }
{ "j": 1, "x": 2 }
* $inc
功能:对指定字段做增减数值操作
说明:增加值用正数,降低值用负数
例子1:找出j为0的文档(符合条件的第一个文档),并将该文档的x字段增加1
>db.things.update({j: 0}, {$inc: {x: 1}})
>db.things.find()
结果:(为方便观察,我省略了"_id"属性)
{ "j": 0, "x": 1 }
{ "j": 0, "x": 1 }
{ "j": 0, "x": 2 }
{ "j": 1, "x": 0 }
{ "j": 1, "x": 1 }
{ "j": 1, "x": 2 }
注意:
1.$inc只能匹配数值类型,否则报错。
如:
>db.things.update({j: 0}, {$inc: {x: 'a'}})
Modifier $inc allowed for numbers only
2.数值由19位组成,包括小树点和减号,不包括科学计数法e。在取舍方面采用四舍五入。
>db.things.update({j: 0}, {$inc: {x: -1.123456789123456789123456789}})
{ "j": 1, "x": -1.1234567891234568 }
>db.things.update({j: 0}, {$inc: {x: -1000}})
{ "j": 1, "x": -1001.1234567891235 }
>db.things.update({j: 0}, {$inc: {x: 123456789123456789123456789}})
{ "j": 1, "x": 1.23456789123456789 e+26 }
3.最大能达到1e+308
>db.things.insert({j: 4, x: 0})
>db.things.update({j: 4}, {$inc: {x: 1e+308}})
{ "j": 4, "x": 1e+308 }
>db.things.insert({j: 5, x: 0})
>db.things.update({j: 5}, {$inc: {x: 1e+309}})
{ "j": 5, "x": Infinity }
* $set
功能:对指定字段赋值
例子1:找出j为0的文档(符合条件的第一个文档),并将该文档的x赋值为10
>db.things.update({j: 0}, {$set: {x: 10}})
{ "j": 0, "x": 10 }
例子2:找出j为0的文档(符合条件的第一个文档),并将该文档的x赋值为'a'
>db.things.update({j: 0}, {$set: {x: 'a'}})
{ "j": 0, "x": 'a' }
* $unset
功能:删除对指定字段
例子1:找出j为0的文档(符合条件的第一个文档),并将该文档的x字段删除
只要用>0的数表示就ok了。
>db.things.update({j: 0}, {$unset: {x: 1}})
或
>db.things.update({j: 0}, {$unset: {x: 0.2}})
{ "j": 0 }
例子2:只要用<=0的数,则表示不删除指定字段
>db.things.update({j: 0}, {$unset: {y: -1}})
或
>db.things.update({j: 0}, {$unset: {y: 0}})
注意:
不能删除系统的_id字段
>db.things.update({j: 0}, {$unset: {_id: 1}})
Mod on _id not allowed
* $push
功能:为数组字段添加元素
例子1:找出j为6的文档,并往该文档的a字段添加0.2数值元素。
>db.things.insert({j: 6, a: [1,2]})
>db.things.update({j: 6}, {$push: {a: 0.2}})
{ "j": 6, "a": [1,2,0.2] }
注意:
1.不能对非数组类型的字段添加元素
>db.things.insert({j: 6, a: [1,2]})
>db.things.update({j: 6}, {$push: {j: 0.2}})
Cannot apply $push/$pushAll modifier to non-array
2.对不存在的字段添加元素,相当于给该文档新增一个数组类型字段。
>db.things.update({j: 6}, {$push: {y: 0.2}})
{ "j": 6, "a": [1,2,0.2], "y":[0.2] }
* $pushAll
功能:为数组字段拼接数组
例子1:找出j为7的文档,将['a','b']拼接到该文档的字段a
>db.things.insert({j: 7, a: [1,2]})
>db.things.update({j: 7}, {$pushAll: {a: ['a','b']}})
{ "j": 7, "a": [1,2,"a","b"] }
注意:
1.不能对非数组类型的字段拼接数组
>db.things.update({j: 7}, {$pushAll: {j: ['a','b']}})
Cannot apply $push/$pushAll modifier to non-array
2.对不存在的字段添加元素,相当于给该文档新增一个数组类型字段。
>db.things.update({j: 7}, {$pushAll: {z: ['a','b']}})
{ "j": 7, "a": [1,2,"a","b"], "z": ["a","b"] }
* $addToSet
功能:当数组字段中不包含指定元素时,将会添加指定元素,若已包含就不进行任何操作。
例子1:找出j为7的文档,若z字段不包含['b','c'],就将['b','c']添加到z字段。
>db.things.update({j: 7}, {$addToSet: {z: ['b','c']}})
{ "j": 7, "a": [1,2,"a","b"], "z": ["a","b", ["b","c"]] }
再重复操作一次,由于z字段已经存在['b','c'],所以不会添加多一次。
>db.things.update({j: 7}, {$addToSet: {z: ['b','c']}})
{ "j": 7, "a": [1,2,"a","b"], "z": ["a","b", ["b","c"]] }
注意:
1.不能应用于非数组类型的字段
>db.things.update({j: 7}, {$addToSet: {j: ['b','c']}})
Cannot apply $push/$pushAll modifier to non-array
2.对不存在的字段进行操作,相当于给该文档新增一个数组类型字段。
>db.things.update({j: 7}, {$addToSet: {h: ['b','c']}})
{ "h": [ ["b", "c"] ], "j": 7, "a": [1,2,"a","b"], "z": ["a","b", ["b","c"]] }
* $pop
功能:删除数组字段中的元素。
例子1:找出j为7的文档,删除h字段的['b','c']
>db.things.update({j: 7}, {$pop: {h: ['b','c']}})
{ "h": [ ], "j": 7, "a": [1,2,"a","b"], "z": ["a","b", ["b","c"]] }
例子2:找出j为7的文档,删除a字段的最后一个元素
>db.things.update({j: 7}, {$pop: {a: 1}})
{ "h": [ ], "j": 7, "a": [1,2,"a"], "z": ["a","b", ["b","c"]] }
例子3:找出j为7的文档,删除a字段的第一个元素
>db.things.update({j: 7}, {$pop: {a: -1}})
{ "h": [ ], "j": 7, "a": [2,"a"], "z": ["a","b", ["b","c"]] }
注意:
1. 0或者正数都表示删除数组字段的最后一个元素
>db.things.update({j: 7}, {$pop: {a: 0}})
{ "h": [ ], "j": 7, "a": [2], "z": ["a","b", ["b","c"]] }
2. 所有负数都表示删除数组字段的第一个元素
>db.things.update({j: 7}, {$pop: {z: -0.1}})
{ "h": [ ], "j": 7, "a": [2], "z": ["b", ["b","c"]] }
3. 当然也不能应用于非数组字段
>db.things.update({j: 7}, {$pop: {j: -1}})
Cannot apply $push/$pushAll modifier to non-array
* $pull
功能:删除数组字段中指定的元素。
例子1:找出j为7的文档,删除a字段的1
>db.things.update({j: 7}, {$pull: {a: 2}})
{ "h": [ ], "j": 7, "a": [], "z": ["b", ["b","c"]] }
例子2:找出j为7的文档,删除a字段的2,注意是所有2都删除了
>db.things.update({j: 7}, {$set: {a: [2,0.2,2,3,2]}})
{ "h": [ ], "j": 7, "a": [2,0.2,2,3,2], "z": ["b", ["b","c"]] }
>db.things.update({j: 7}, {$pull: {a: 2}})
{ "h": [ ], "j": 7, "a": [0.2, 3], "z": ["b", ["b","c"]] }
注意: 当然也不能应用于非数组字段
>db.things.update({j: 7}, {$pop: {j: 2}})
Cannot apply $push/$pushAll modifier to non-array
* $pullAll
功能:删除数组字段中指定的元素。
例子1:找出j为7的文档,删除a字段的2和0.2,注意是所有的2和所有的0.2
>db.things.update({j: 7}, {$set: {a: [2,0.2,2,3,2]}})
{ "h": [ ], "j": 7, "a": [2,0.2,2,3,2], "z": ["b", ["b","c"]] }
>db.things.update({j: 7}, {$pullAll: {a: [2,0.2]}})
{ "h": [ ], "j": 7, "a": [3], "z": ["b", ["b","c"]] }
注意: 当然也不能应用于非数组字段
>db.things.update({j: 7}, {$pop: {j: 2}})
Cannot apply $push/$pushAll modifier to non-array
本文来源 我爱IT技术网 http://www.52ij.com/jishu/4746.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
