更新
Updates 类为MongoDB更新操作符提供静态工厂方法。每个方法都返回一个 Bson
类型的实例,而该实例又可以传递给任何需要更新的方法。
您可以静态导入Updates
类的方法,如以下代码所示:
import org.mongodb.scala.model.Updates._
本指南中的示例假定此静态导入。
字段更新
本节介绍应用于整个字段值的更新操作符。
集
$set
更新操作符将字段的值设置为指定值。
以下示例将quantity
字段的值设置为11
:
set("quantity", 11)
未设置
$unset
更新操作符删除具有给定名称的字段。
以下示例删除了 quantity
字段:
unset("quantity")
Set On Insert
$setOnInsert
更新操作符会将字段的值设置为给定值,但更新或插入(upsert)是该更新是导致插入文档的更新或插入操作。
如果更新或更新或插入(upsert)导致插入文档,以下示例会将defaultQuantity
字段的值设置为10
:
setOnInsert("defaultQuantity", 10)
增量
$inc
更新操作符将数字字段的值按指定值递增。
以下示例将quantity
字段的值递增5
:
inc("quantity", 5)
乘
$mul
更新操作符将数值字段的值乘以指定值。
以下示例将price
字段的值乘以1.2
:
mul("price", 1.2)
rename
$rename
更新操作符重命名字段。
以下示例将qty
字段重命名为quantity
:
rename("qty", "quantity")
Min
如果指定值小于字段的当前值,则$min
更新操作符会将字段值更新为指定值。
以下示例将lowScore
字段的值设置为其当前值和150
中的最小值:
min("lowScore", 150)
Max
如果指定值大于字段的当前值,则$max
更新操作符会将字段值更新为指定值。
以下示例将highScore
字段的值设置为其当前值和900
中的最大值:
max("highScore", 900)
当前日期
$currentDate
更新操作符将指定名称的字段的值设置为当前日期,可以是BSON日期或BSON时间戳。
以下示例将lastModified
字段的值设置为BSON日期类型的当前日期:
currentDate("lastModified")
以下示例将lastModified
字段的值设置为 BSON 时间戳类型的当前日期:
currentTimestamp("lastModified")
Bit
$bit
更新操作符对字段的整数值执行按位更新。
以下示例在数字10
和掩码字段的整数值之间执行按位AND
:
bitwiseAnd("mask", 10)
以下示例在数字10
和掩码字段的整数值之间执行按位OR
:
bitwiseOr("mask", 10)
以下示例在数字10
和掩码字段的整数值之间执行按位XOR
:
bitwiseXor("mask", 10)
Array Updates
本节介绍应用于字段大量值内容的更新操作符。
Add to Set
$addToSet
更新操作符会向数组添加一个值,除非该值已经存在,在这种情况下,该操作符不会对该数组执行任何操作。
以下示例将值"a"
添加到letters
字段的数组值:
addToSet("letters", "a")
以下示例将值"a"
、 "b"
和"c"
中的每一个添加到letters
字段的数组值中:
addEachToSet("letters", Arrays.asList("a", "b", "c"))
Pop
$pop
更新操作符删除数组的第一个或最后一个元素。
以下示例删除scores
字段的数组值的第一个元素:
popFirst("scores")
以下示例删除scores
字段的数组值的最后一个元素:
popLast("scores")
Pull All
$pullAll
更新操作符会从现有大量中删除指定值的所有实例。
以下示例从scores
数组中删除分数0
和5
:
pullAll("scores", Arrays.asList(0, 5))
Pull
$pull
更新运算符会从现有数组中删除与指定查询匹配的一个或多个值的所有实例。
以下示例从scores
数组中删除0
值:
pull("scores", 0)
以下示例从votes
大量中删除所有大于或等于6
的元素:
pullByFilter(Filters.gte("votes", 6))
推动
$push
更新操作符将指定值附加到数组。
以下示例将值89
推送到scores
大量:
push("scores", 89)
以下示例将值89
、 90
和92
推送到scores
数组:
pushEach("scores", 89, 90, 92)
以下示例将值89
、 90
和92
推送到scores
数组的开头:
pushEach("scores", new PushOptions().position(0), 89, 90, 92)
以下示例将值89
、 90
和92
推送到scores
数组,按降序对数组进行排序,并删除数组中除前5
元素之外的所有元素:
pushEach("scores", new PushOptions().sort(-1).slice(5), 89, 90, 92)
以下示例将文档{ wk: 5, score: 8 }
、 { wk: 6,
score: 7 }
和{ wk: 7, score: 6 }
推送到 quizzes 数组,按分数对数组进行降序排序,并删除数组中除最后3
元素之外的所有元素:
pushEach("quizzes", new PushOptions().sortDocument(Sorts.descending("score")).slice(-3), Document("week" -> 5, "score" -> 8), Document("week" -> 6, "score" -> 7), Document("week" -> 7, "score" -> 6))
组合多个更新运算符
通常,应用程序必须通过组合前面各节中描述的两个或多个更新操作符来自动更新单个文档的多个字段。
以下示例将quantity
字段的值设置为11
,将total
字段的值设置为30.40
,并将值4.99
、 5.99
和10.99
推送到数组值prices
字段的以下内容:
combine(set("quantity", 11), set("total", 30.40), pushEach("prices", 4.99, 5.99, 10.99))