MongoDB 更新文档并添加新属性
本文关键字:属性 新属性 添加 更新 文档 MongoDB | 更新日期: 2023-09-27 18:35:40
我正在使用 C# 3.2 驱动程序并尝试插入或更新文档,并且(可能)添加一些新字段。我的代码如下所示:
var collection = database.GetCollection<BsonDocument>("User");
var filter = Builders<BsonDocument>.Filter.Eq("UserID", "mkemp");
var update = Builders<BsonDocument>.Update
.Set("FirstName", "Mike")
.Set("LastName", "Kemp");
update.AddToSet("Age", "57");
var result = collection.UpdateOne(filter, update , new UpdateOptions() { IsUpsert = true });
将创建"名字"和"姓氏",但不会创建或更新"年龄"字段。我正在根据表单帖子保存数据,因此我事先不知道将发布哪些字段。有没有办法完成上述工作?
这比你想象的要容易:在Mongo中,如果不存在一个属性,则创建。
AddToSet
不是设置简单的值,而是将项添加到存储在给定属性名称中的数组中,并实现集合语义。也就是说,如果您使用 AddToSet
添加项目,您将创建一个唯一项目数组(取自 Mongo 文档):
$addToSet运算符向数组添加一个值,除非该值是 已经存在,在这种情况下,$addToSet对该数组不执行任何操作。
有关$set
,请参阅以下文档:
如果该字段不存在,$set将添加一个带有 指定值,前提是新字段不违反类型 约束。如果为不存在的字段指定虚线路径, $set将根据需要创建嵌入的文档,以实现 到字段的虚线路径。
我遇到了同样的问题,但它可以工作,这是我的代码:
var collection = database.GetCollection<BsonDocument>("CollectionName");
var filter = Builders<BsonDocument>.Filter.Eq("UserID", "mkemp");
var update = new UpdateDefinitionBuilder<BsonDocument>().Set("PropertyName", "PropertyValue");
var result = await collection.UpdateOneAsync(filter, update);
log.Write($"Added {propertyName} property to {result.ModifiedCount} documents");
就我而言,如果属性尚不存在,我想向所有文档添加一个属性,所以我这样做了:
private async Task AddDecimalPropertyAsync(string propertyName, IMongoCollection<BsonDocument> collection, ILog log)
{
var filter = Builders<BsonDocument>.Filter.Exists(propertyName, false);
var update = new UpdateDefinitionBuilder<BsonDocument>().Set(propertyName, 0m);
var result = await collection.UpdateManyAsync(filter, update);
log.Write($"Added {propertyName} decimal property to {result.ModifiedCount} documents");
}