说明
mongodb不支持事务,但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。
修改示例
MongoDB提供了两种更新方式 替换与更新
替换
获取一条数据
db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a7")})
结果如下: ID 590a9d1723485e21b8eb19a7
{
"_id" : ObjectId("590a9d1723485e21b8eb19a7"),
"address" : "蛟河市",
"age" : 116,
"email" : "tawyabhfphgz@.com",
"height" : 157,
"job" : "其他木材采运人员",
"nickname" : "邓己久",
"phone" : "12510386447",
"school" : "辽宁特殊教育师范高等专科学校",
"sex" : 1,
"hoby" : [
"天津工程职业技术学院",
"包头铁道职业技术学院",
"电机装配工",
"火炮膛线制作工"
],
"dog" : {
"name" : "扶丙久",
"age" : 16
}
}
进行操作
db.user.update({"_id":ObjectID("590a9d1723485e21b8eb19a7")},{"hello":"mongDB"})
再来查询
db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a7")})
结果如下
{
"_id" : ObjectId("590a9d1723485e21b8eb19a7"),
"hello" : "mongDB"
}
结论:MongoDB完全生成了一个新的文档覆盖了旧的文档.
更新
针对上面数据执行如下语句进行修改
db.user.update({"_id":ObjectID("590a9d1723485e21b8eb19a7")},{$set: {"age":100,"phone":13000000001}})
查询这条数据修改后的结果
db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a7")})
{
"_id" : ObjectId("590a9d1723485e21b8eb19a7"),
"hello" : "mongDB",
"age" : 100,
"phone" : 13000000001
}
结论 : 可以看到hello MongoDB 这对 key-value并没有改变,而是增加了 age,phone两个key和对应的值
修改结论
上面的针对性更新操作 就是表述的 MongoDB中的原子性更新,它并不会影响其他的原子性操作只是针对文档进行针对性操作.
原子性常用操作命令
更新操作
$set 更新文档中的某一个键,如果不存在则添加,如果存在则替换
$unset 删除文档中的某一个键
$inc 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作
$rename 对键进行重命名
数组的更新操作
$push 把value追加到key里面去,key一定要是数组类型才行,如果key不存在,会新增一个数组类型加进去
$pushall 同 push,只是一次可以追加多个值到一个数组字段内
$addToSet : 增加一个值到数组内,而且只有当这个值不在数组内才增加
$pop 删除数组的第一个或最后一个元素 ,接受两个参数 key 和 1or-1 1 表示最后一个元素,-1表示第一个元素
$pull
从数组内删除一个等于value值
$pullAll
从数组内删除多个等于不同value值
Java中原子操作
查询一条数据
db.user.find({"_id":ObjectID("590a9d1723485e21b8eb19a8")})
结果
这里写代码片
{
"_id" : ObjectId("590a9d1723485e21b8eb19a8"),
"address" : "佳木斯",
"age" : 76,
"email" : "pzqhlymnwvsr@.com",
"height" : 187,
"job" : "火工品管理工",
"nickname" : "须尤央",
"phone" : "11209067005",
"school" : "梧州学院",
"sex" : 0,
"hoby" : [
"审计人员",
"河北师范大学汇华学院",
"中南民族大学",
"基础件装配工"
],
"dog" : {
"name" : "葛习厉",
"age" : 103
},
"hello" : 1,
"count" : 10
}
替换
代码
@Test
public void testReplace(){
Document doc = new Document("count", 10);
coll.replaceOne(Filters.eq("_id", new ObjectId("590a9d1723485e21b8eb19a8")), doc);
}
结果
{
"_id" : ObjectId("590a9d1723485e21b8eb19a8"),
"count" : 10
}
更新
代码(命令形式)
@Test
public void testAtomically(){
Document doc = new Document();
doc.append("$set", new Document("hello", "mongodb"));
coll.updateOne(Filters.eq("_id", new ObjectId("590a9d1723485e21b8eb19a8")), doc);
}
结果
{
"_id" : ObjectId("590a9d1723485e21b8eb19a8"),
"count" : 10,
"hello" : "mongodb"
}
代码 工具类
@Test
public void testAtomically2(){
coll.updateOne(Filters.eq("_id", new ObjectId("590a9d1723485e21b8eb19a8")), Updates.set("ok", "good"));
}