原子操作
最后更新于:2022-04-02 03:59:44
[TOC]
## 概述
mongodb不支持事务,使用原子操作来删改文档
### findAndModify和update有什么区别
1. 默认情况下,findAndModify()方法返回 文档 的预修改版本。 要获取更新的文档,请使用新选项, update()方法返回一个包含操作状态的WriteResult对象
2. update()方法可以修改多个文档
3. 如果多个文档符合更新条件,那么对于findAndModify(),您可以指定一个sorting来提供某种控制措施来更新要更新的文档。 使用update()方法的默认行为,当多个文档匹配时,不能指定要更新哪个文档
4.
## 常用命令
### $set 添加一个属性
用来指定一个键并更新键值,若键不存在并创建。
```
{ $set : { field : value } }
```
实例:添加 address属性
```
db.test.insert({name:"1234",age:123})
db.test.findAndModify({
query: {
name: "1234"
},
update: {
$set: {
address: "zj"
}
}
})
/**
{
"_id": ObjectId("5e0b0ddd81ce6f4e10006472"),
"name": "1234",
"age": 123,
"address": "zj"
}
*/
```
### $unset
删除属性
用来删除一个键。
```
{ $unset : { field : 1} }
```
实例
```
db.test.insert({name:"1234",age:"123"})
db.test.findAndModify({
query: {
name: "1234"
},
update: {
$unset: {
age: 1
}
}
})
/**
{
"_id": ObjectId("5e0b0ddd81ce6f4e10006472"),
"name": "1234"
}*/
```
### $inc 对曾数增减操作
某个值为数字型(只能为满足要求的数字)的键进行增减
```
{ $inc : { field : value } }
```
```
db.test.insert({name:"1234",age:123})
db.test.findAndModify({
query: {
name: "1234"
},
update: {
$inc: {
age: -13
}
}
})
```
### $push 追加到数组中
`{ $push : { field : value } }`
```
db.test.insert({name:"1234",age:123,tel:[123,345]})
db.test.findAndModify({
query: {
name: "1234"
},
update: {
$push: {
tel: [888]
}
}
})
/**
{
"_id": ObjectId("5e0b100581ce6f4e10006475"),
"name": "1234",
"age": 123,
"tel": [
123,
345,
777,
]
}
*/
```
### $pushAll 追加多个值
同$push,只是一次可以追加多个值到一个数组字段内。
`{ $pushAll : { field : value_array } }`
### $pull
从数组field内删除一个等于value值。
{ $pull : { field : _value } }
#### 索引数组
```
db.test.insert({name:"1234",age:123,tel:[123,345]})
db.test.findAndModify({
query: {
name: "1234"
},
update: {
$pull: {
tel: 123
}
}
})
/*
{
"_id": ObjectId("5e0b112c81ce6f4e10006476"),
"name": "1234",
"age": 123,
"tel": [
345
]
}
*/
```
#### 对象数组
```
db.test.insert({name:"1234",age:123,tel:[{a:1,b:3},{a:2,b:6}]})
db.test.findAndModify({
query: {
name: "1234"
},
update: {
$pull: {
tel:{
a:1
}
}
}
})
/**
{
"_id": ObjectId("5e0b126181ce6f4e1000647e"),
"name": "1234",
"age": 123,
"tel": [
{
"a": 2,
"b": 6
}
]
}
*/
```
### $addToSet 当值不存在,追加到数组
实例
```
db.test.insert({name:"1234",age:123,tel:[1,2,3]})
db.test.update(
{
name: "1234"
},
{
$addToSet: {
tel:3
}
}
)
/*
{
"_id": ObjectId("5e0b144981ce6f4e10006487"),
"name": "1234",
"age": 123,
"tel": [
1,
2,
3
]
}
*/
```
### $pop
```
{ $pop : { field : 1 } }
1 删除最后一个
-1 删除第一个
```
```
db.test.insert({name:"1234",age:123,tel:[1,2,3]})
db.test.update(
{
name: "1234"
},
{
$pop: {
tel:1
}
}
)
/**
{
"_id": ObjectId("5e0b14a281ce6f4e10006488"),
"name": "1234",
"age": 123,
"tel": [
1,
2
]
}
*/
```
### $rename 重命名字段
`{ $rename : { old_field_name : new_field_name } }
`
实例
```
db.test.insert({name:"1234",age:123,tel:[1,2,3]})
db.test.update(
{
name: "1234"
},
{
$rename: {
age:"age_new"
}
}
)
```
### $bit
';