MongoDB 更新操作符
以下修改器可用于更新操作。例如 – 在db.collection.update()和db.collection.findAndModify()
中。
在文档中定义操作符表达式的形式:
{
<operator1>: { <field1>: <value1>, ... },
<operator2>: { <field2>: <value2>, ... },
}
字段操作符
$currentDate
它将字段的元素更新为当前日期,可以是日期或时间戳。这个操作员的默认数据类型是日期。
语法:
{ $currentDate: { <field1>: <typeSpecification1>, ... } }
示例:
db.books.insertOne(
{ _id: 1, status: "a", lastModified: purchaseDate("2013-10-02T01:11:18.965Z") }
)
$inc
它根据指定的值增加一个字段。
语法:
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
示例:
{
_id: 000438,
sku: "MongoDB",
quantity: 1,
metrics: {
orders: 2,
ratings: 3.5
}
}
$min
如果指定的值小于当前字段的值,则将字段的值更改为指定的值。
语法:
{ $min: { <field1>: <value1>, ... } }
示例:
{ _id: 0021, highprice: 800, lowprice: 200 }
db.books.update( { _id: 0021 }, { $min: { highprice: 500 } } )
$max`
如果指定的值大于字段的当前值,则将字段的值更改为指定的值。
语法:
{ $max: { <field1>: <value1>, ... } }
示例:
{ _id: 0021, highprice: 800, lowprice: 200 }
db.books.update( { _id: 0021 }, { $max: { highprice: 950 } } )
$mul
它将字段的值乘以一个数字。
语法:
{ $mul: { <field1>: <number1>, ... } }
示例:
db.books.update(
{ _id: 1 },
{ $mul: { price: NumberDecimal("180.25"), qty: 2 } }
)
$rename
命令
该命令用于改变字段的名称。
语法:
{$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
示例:
db.books.updateMany( {}, { $rename: { "nmae": "name" } } )
$set
set操作符将指定字段的值更改为指定的值。
语法:
{ $set: { <field1>: <value1>, ... } }
示例:
{
_id: 100,
sku: "abc123",
quantity: 50,
instock: true,
reorder: false,
details: { model: "14Q2", make: "xyz" },
tags: [ "technical", "non technical" ],
ratings: [ { by: "ijk", rating: 4 } ]
}
$setOnInsert
如果upsert设置为true,则插入一个文档。setOnInsert操作符将指定的值分配给文档中的字段。
语法:
db.collection.update(
<query>,
{ $setOnInsert: { <field1>: <value1>, ... } },
{ upsert: true }
)
$unset
它删除指定的字段。
语法:
{ $unset: { <field1>: "", ... } }
示例:
db.products.update(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
)
数组运算符
$
我们可以在数组中更新一个元素,而不需要明确指定元素的位置。
语法:
{ "<array>.$" : value }
示例:
db.collection.update(
{ <array>: value ... },
{ <update operator>: { "<array>.$" : value } }
)
$[ ]
定位操作符表示更新操作符应该更改给定数组字段中的所有元素。
语法:
{ <update operator>: { "<array>.$[]" : value } }
示例:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[]" : value } }
)
$[<identifier>]
这是一个过滤位置运算符,用于标识数组元素。
语法:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
示例:
db.collection.updateMany( { <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] } )
$addToSet
它将一个元素添加到数组中,除非该元素已经存在,否则该操作符不对该数组进行任何操作。
语法:
{ $addToSet: { <field1>: <value1>, ... } }
示例:
db.books.update(
{ _id: 1 },
{ $addToSet: { tags: "MongoDB" } }
)
$pop
我们可以使用pop运算符从数组中删除第一个或最后一个元素。我们需要将pop的值分别设置为-1和1,以删除数组的第一个元素和最后一个元素。
语法:
{ $pop: { <field>: <-1 | 1>, ... } }
示例:
db.books.update( { _id: 1 }, { $pop: { mongoDB: -1 } } )
$pull
使用pull运算符,我们可以删除数组中与指定条件匹配的所有值的实例。
语法:
{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
示例:
db.books.update( { }, { pull: { Development: {in:["Java", "RDBMS" ] }, Tech: "Cybersecurity" } },
{ multi: true }
)
$push
它将指定的值添加到数组中。
语法:
{ $push: { <field1>: <value1>, ... } }
示例:
db.students.update( { _id: 9 }, { $push: { scores: 91 } } )
$pullAll
使用$pullAll操作符,我们可以从现有数组中删除所有匹配指定值的实例。它会删除与指定值相匹配的元素。
语法:
{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
示例:
db.survey.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )
修改器
$each
它与$addToSet
操作符和$push操作符一起使用。它与addToSet操作符一起使用,如果在字段中不存在该值,则将多个值添加到数组中。
语法:
{ addToSet: { <field>: {each: [ <value1>, <value2> ... ] } } }
它与push运算符一起使用,用于将多个值附加到数组中。
语法:
{ push: { <field>: {each: [ <value1>, <value2> ... ] } } }
示例:
db.students.update( { name: "Akki" }, { push: { scores: {each: [ 90, 92, 85 ] } } } )
$position
它指定了push操作符在数组中插入元素的位置。
语法:
{
push: {
<field>: {each: [ <value1>, <value2>, ... ],
$position: <num>
}
}
}
示例:
db.students.update(
{ _id: 1 },
{
push: {
scores: {each: [ 50, 60, 70 ],
$position: 0
}
}
}
)
$slice
此修饰符用于在push操作过程中限制数组元素的数量。
语法:
{
push: {
<field>: {each: [ <value1>, <value2>, ... ],
$slice: <num>
}
}
}
示例:
db.students.update(
{ _id: 1 },
{
push: {
scores: {each: [ 80, 78, 86 ],
$slice: -5
}
}
}
)
$sort
sort修饰符在推送操作期间对数组的值进行排序。
语法:
{
push: {
<field>: {each: [ <value1>, <value2>, ... ],
$sort: <sort specification>
}
}
}
示例:
db.students.update(
{ _id: 1 },
{
push: {
quizzes: {each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
$sort: { score: 1 }
}
}
}
)
位运算符
$bit
位运算符通过位运算来更新字段。它支持位与、位或和位异或操作。
语法:
{ $bit: { <field>: { <and|or|xor>: <int> } } }
示例:
db.books.update( { _id: 1 }, { $bit: { expdata: { and: price(100) } } }
)