数组更新运算符:
运算符 | 含义 |
---|---|
$ | 充当占位符以更新与查询条件匹配的第一个元素,占位符:代表匹配条件的第一个元素 |
$[] | 充当占位符以更新数组中与查询条件匹配的文档中的所有元素 |
$[< identifier>] | 充当占位符以更新与查询条件匹配的文档的arrayFilters条件匹配的所有元素 |
$addToSet | 仅当数组中尚不存在元素时才将元素添加到数组中 |
$pop | 删除数组的第一个或最后一个项目 |
$pull | 删除与指定查询匹配的所有数组元素 |
$push | 将项添加到数组 |
$pullAll | 从数组中删除所有匹配的值 |
数组更新修饰符:
运算符 | 含义 |
---|---|
$each | 修改push和addToSet运算符以附加多个项目以进行数组更新 |
$position | 修改push运算符以指定数组中添加元素的位置 |
$slice | 修改 push运算符以限制更新数组的大小 |
$sort | 修改push运算符以重新排序存储在数组中的文档 |
1、$单个元素占位符
例子:
db.students.insert([
{ "_id" : 1, "grades" : [ 85, 80, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])
操作:
db.students.updateOne(
{ _id: 1, grades: 80 }, #查找_id=1且grades数组中80的数字
{ $set: { "grades.$" : 82 } } #grades.$表示符合条件的第一个元素
)
结果:
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
2、$[]数组元素占位符
例子:
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
操作 :
db.students.update(
{ }, #匹配所有
{ $inc: { "grades.$[]": 10 } }, #数组内所有元素减10
{ multi: true }
)
结果:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
3、$[< identifier>] 匹配条件占位符
例子:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
运算:
db.students.update(
{ },
{ $set: { "grades.$[element]" : 100 } }, #声明使用element过滤器
{ multi: true,
arrayFilters: [ { "element": { $gte: 100 } } ] #过滤器
}
)
结果:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }
4、$addToSet数组元素添加运算符
例子:
{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }
运算:
db.inventory.update(
{ _id: 1 },
{ $addToSet: { tags: "accessories" } }
)
5、$pop删除数组元素运算符
例子:
{ _id: 1, scores: [ 8, 9, 10 ] }
运算:
//删除第一个
db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )
//删除最后一个
db.students.update( { _id: 1 }, { $pop: { scores: 1 } } )
6、$pul删除匹配的数组元素
例子:
{
_id: 1,
fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],
vegetables: [ "carrots", "celery", "squash", "carrots" ]
}
{
_id: 2,
fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],
vegetables: [ "broccoli", "zucchini", "carrots", "onions" ]
}
运算:
db.stores.update(
{ },//删除一下匹配到的数组元素
{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
{ multi: true }
)
结果:
{
"_id" : 1,
"fruits" : [ "pears", "grapes", "bananas" ],
"vegetables" : [ "celery", "squash" ]
}
{
"_id" : 2,
"fruits" : [ "plums", "kiwis", "bananas" ],
"vegetables" : [ "broccoli", "zucchini", "onions" ]
}
7、向数组添加元素
例子:
db.students.update(
{ _id: 1 },
{ $push: { scores: 89 } }
)
运算:
db.students.update(
{ name: "joe" },
{ $push: { scores: { $each: [ 90, 92, 85 ] } } }
)
8、$pullAll删除数组中匹配到的所有元素
例子:
{ _id: 1, scores: [ 0, 2, 5, 5, 1, 0 ] }
运算:
db.survey.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )
结果:
{ "_id" : 1, "scores" : [ 2, 1 ] }
9、$each配合push和addToSet运算符向数组中添加多个元素
db.students.update(
{ name: "joe" },
{ $push: { scores: { $each: [ 90, 92, 85 ] } } }
)
10、$position配合push运算符将元素添加到数组指定位置
例子:
{ "_id" : 1, "scores" : [ 50, 60, 70, 100 ] }
操作:
db.students.update(
{ _id: 1 },
{
$push: {
scores: {
$each: [ 20, 30 ],
$position: 2
}
}
}
)
结果:
{ "_id" : 1, "scores" : [ 50, 60, 20, 30, 70, 100 ] }
11、$slice限制push运算数组大小
例子:
{ "_id" : 1, "scores" : [ 40, 50, 60 ] }
运算:
db.students.update(
{ _id: 1 },
{
$push: {
scores: {
$each: [ 80, 78, 86 ],
$slice: -5 //只保留最后五个
}
}
}
)
结果:
{ "_id" : 1, "scores" : [ 50, 60, 80, 78, 86 ] }
12、$sort配合push从新排序数组
例子:
{
"_id": 1,
"quizzes": [
{ "id" : 1, "score" : 6 },
{ "id" : 2, "score" : 9 }
]
}
运算:
db.students.update(
{ _id: 1 },
{
$push: {
quizzes: {
$each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
$sort: { score: 1 }
}
}
}
)
结果:
{
"_id" : 1,
"quizzes" : [
{ "id" : 1, "score" : 6 },
{ "id" : 5, "score" : 6 },
{ "id" : 4, "score" : 7 },
{ "id" : 3, "score" : 8 },
{ "id" : 2, "score" : 9 }
]
}