MongoDB 的更新操作符

$ 符号

这个符号是一个占位符,用来更新数组中匹配查询条件的第一个元素。例如,如果你想要更新 books 数组中 title 为”The Catcher in the Rye” 的元素的 author 字段,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Eq("books.title", "The Catcher in the Rye");
var update = Builders<BsonDocument>.Update.Set("books.$.author", "J.D. Salinger");
col.UpdateOne(filter, update);

$[] 符号

这个符号是一个占位符,用来更新数组中的所有元素。例如,如果你想要更新 books 数组中所有元素的 price 字段,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.Set("books.$[].price", 9.99);
col.UpdateMany(filter, update);

$[<identifier>] 符号

这个符号是一个占位符,用来更新数组中匹配 arrayFilters 条件的所有元素。

  • 如果你想要更新 books 数组中 price 大于 10 的元素的 discount 字段,你可以使用以下代码:
1
2
3
4
5
6
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.Set("books.$[elem].discount", 0.8);
var arrayFilters = new List<ArrayFilterDefinition> {
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("elem.price", new BsonDocument("$gt", 10)))
};
col.UpdateMany(filter, update, new UpdateOptions { ArrayFilters = arrayFilters });
  • 如果你想要替换数组 caricature 中 name 为 DeathNote 的元素的全部内容,用一个新的集合来代替,你可以使用以下代码来实现这个功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 定义一个新的集合,用来替换原来的元素
var newBook = new BsonDocument {
{ "name", "DeathNote" },
{ "Year", "2004" },
{ "price", "10" },
};

// 定义一个过滤条件,用来匹配你想要更新的文档的_id字段
var filter = Builders<BsonDocument>.Filter.Eq("_id", "01");

// 定义一个更新操作,用来替换caricature数组中name为DeathNote的元素
var update = Builders<BsonDocument>.Update.Set("caricature.$[elem]", newBook);

// 定义一个数组过滤条件,用来指定你想要替换的数组元素的name值
var arrayFilters = new List<ArrayFilterDefinition> {
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("elem.name", "DeathNote"))
};

// 执行更新操作,根据过滤条件和数组过滤条件来修改文档的字段的值
col.UpdateOne(filter, update, new UpdateOptions { ArrayFilters = arrayFilters });

增加

$push

这个符号用来向数组中添加一个元素。例如,如果你想要向 books 数组中添加一个元素,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.Push("books", new BsonDocument { { "title", "The Catcher in the Rye" }, { "author", "J.D. Salinger" }, { "price", 9.99 } });
col.UpdateOne(filter, update);

$addToSet

这个符号用来向数组中添加元素,只有当元素不存在于数组中时才会添加。例如,如果你想要向 books 数组中添加一个新的元素,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.AddToSet("books", new BsonDocument { { "title", "1984" }, { "author", "George Orwell" }, { "price", 8.99 } });
col.UpdateOne(filter, update);

删除

$pop

这个符号用来从数组中移除第一个或最后一个元素。例如,如果你想要从 books 数组中移除最后一个元素,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.PopLast("books");
col.UpdateOne(filter, update);

$pull

这个符号用来从数组中移除所有匹配指定查询的元素。例如,如果你想要从 books 数组中移除 author 为”J.D. Salinger” 的元素,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.Pull("books", new BsonDocument("author", "J.D. Salinger"));
col.UpdateOne(filter, update);

$pullAll

这个符号用来从数组中移除所有匹配指定值的元素。例如,如果你想要从 books 数组中移除 title 为”1984” 或”The Catcher in the Rye” 的元素,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Empty;
var update = Builders<BsonDocument>.Update.PullAll("books", new BsonArray { new BsonDocument("title", "1984"), new BsonDocument("title", "The Catcher in the Rye") });
col.UpdateOne(filter, update);

修改

$rename

这个符号用来重命名文档中的字段。 例如,如果你想要把 books 数组中 title"1984" 的元素的 price 字段重命名为 "cost",你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Eq("books.title", "1984");
var update = Builders<BsonDocument>.Update.Rename("books.$.price", "books.$.cost");
col.UpdateOne(filter, update);

$set

这个符号用来设置文档中的字段的值。 例如,如果你想要给 books 数组中 title"1984" 的元素的 cost 字段设置为 8.99,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Eq("books.title", "1984");
var update = Builders<BsonDocument>.Update.Set("books.$.cost", 8.99);
col.UpdateOne(filter, update);

$unset

这个符号用来删除文档中的字段。 例如,如果你想要删除 books 数组中 title"1984" 的元素的 cost 字段,你可以使用以下代码:

1
2
3
var filter = Builders<BsonDocument>.Filter.Eq("books.title", "1984");
var update = Builders<BsonDocument>.Update.Unset("books.$.cost");
col.UpdateOne(filter, update);