MongoDB – 位置运算符 ($)
MongoDB 提供了不同类型的数组更新运算符来更新文档中数组字段的值,位置运算符( $ ) 就是其中之一。此运算符识别数组中要更新的元素,而无需明确指定该项目在数组中的位置。
句法:
{ ".$" : value }
- 不能将
$
运算符用于 upsert 操作。如果将 $运算符与 upsert 操作一起使用,则插入操作将使用 $ 作为插入文档中的字段名称。 - 此运算符不能用于那些遍历多个数组的查询,因为
$
占位符的替换是单个值。 - 当您使用
$
运算符$未设置运算符,那么$运算符不从数组中删除匹配的项目,而是将其设置为空。 - 当查询在 $not、$ne 或 $nin 等否定运算符的帮助下匹配数组时,您不能使用
$
运算符来更新该数组的值。如果查询的否定部分存在于 $elemMatch 表达式中,那么您可以使用位置$
运算符来更新此字段。 - 当您将此运算符与
db.collection.update()
和db.collection.findAndModify()
等更新操作一起使用时,$
运算符符将用作与查询文档匹配的第一个项目的占位符,并且需要使用数组字段作为查询文档的一部分出现。
在以下示例中,我们正在使用:
Database: GeeksforGeeks
Collection: contributor
Document: two documents that contain the details of the contributor in the form of field-value pairs.
使用$
运算符更新数组中的值:
在这个例子中,我们在$
运算符的帮助下将语言字段中值为“ Python ”的第一个项目更新为“Ruby”,因为我们不知道该项目在数组中的位置。
db.contributor.updateOne({name: "Rohit", language: "Python"},
{$set: {"language.$": "Ruby"}})
在这里, $
运算符符用作更新查询文档的第一个匹配项的占位符。
注意:数组字段必须是查询的一部分。
使用$
运算符更新数组中的文档:
在这个例子中,我们在$
运算符的帮助下更新一个包含嵌入文档的数组,并使用点表示法访问嵌入的文档字段。或者换句话说,我们正在将 tArticle 字段的值从 60 更新为 100。
db.contributor.updateOne({name: "Rohit", "articles.language": "C#"},
{$set: {"articles.$.tArticles": 100}})
使用多个字段匹配更新嵌入的文档:
在此示例中,我们将更新第一个嵌入文档中 tArticles 字段的值,该文档的 pArticles 字段的值大于 90。
db.contributor.updateOne({name: "Sumit", articles: {$elemMatch:
{pArticles: {$gt: 30}}}},
{$set: {"articles.$.tArticles": 200}})