如何使用 C# Mongodb 驱动程序类型的方法更新数组文档元素的字段
How to use C# Mongodb driver typed methods Update fields of array document elements
使用 MongoDB C# 驱动程序版本 2.0.1 和 Mongodb 3.0,是否可以使用类型化方法更新数组字段文档元素?
例如我有以下文档:
{
Name:"Ken",
ContactNo:[ { Number:"123", Type:"Mobile"},
{ Number:"456", Type:"Office"},
{ Number:"531", Type:"Fax"}
]
}
如何使用类型化的 C# 方法执行以下操作:
1) 将 ContactNo
数组的所有元素的 Type
字段更新为“PABX
”
2) 更新 ContactNo
数组文档元素的 Type
字段,其 Number
字段等于“123
”为“Fiber
”
3) 更新Contact
数组的第一个元素并将其Type
字段设置为“Unknown
”
目前无法使用位置运算符更新数组中的所有项目。参见 this Whosebug question and this MongoDB issue。但是,如果您提前知道数组中元素的数量(或者可以通过某种方式获得),那么这将起作用:
var numberOfElementsInArray = 3;
var filter = Builders<Contact>.Filter.Eq("Name", "Ken");
var update = Builders<Contact>.Update.Combine(Enumerable.Range(0, numberOfElementsInArray)
.Select(i => Builders<Contact>.Update.Set("ContactNo." + i + ".Type", "PABX")));
collection.UpdateOneAsync(filter, update).Wait();
此代码将 ContactNo
数组中 Number
为 123
的元素的 Type
属性 设置为Fiber
:
var filter = Builders<Contact>.Filter.And(
Builders<Contact>.Filter.Eq("Name", "Ken"),
Builders<Contact>.Filter.Eq("ContactNo.Number", "123"));
var update = Builders<Contact>.Update.Set("ContactNo.$.Type", "Fiber");
collection.UpdateOneAsync(filter, update).Wait();
此代码会将 ContactNo
数组中第一个元素的 Type
属性 设置为 Unknown
:
var filter = Builders<Contact>.Filter.Eq("Name", "Ken");
var update = Builders<Contact>.Update.Set("ContactNo.0.Type", "Unknown");
collection.UpdateOneAsync(filter, update).Wait();
请注意,所有这些代码都假定您有一个名为 Contact
的 class 对应于您在问题中指定的数据(您的实际 class 可能被称为其他名称,我只是在这里称它为 Contact
),而 collection
是 IMongoCollection<Contact>
的一个实例。
例如:
var client = new MongoClient("mongodb://localhost:27017");
var collection = client.GetDatabase("your database").GetCollection<Contact>("your collection name");
使用 MongoDB C# 驱动程序版本 2.0.1 和 Mongodb 3.0,是否可以使用类型化方法更新数组字段文档元素?
例如我有以下文档:
{
Name:"Ken",
ContactNo:[ { Number:"123", Type:"Mobile"},
{ Number:"456", Type:"Office"},
{ Number:"531", Type:"Fax"}
]
}
如何使用类型化的 C# 方法执行以下操作:
1) 将 ContactNo
数组的所有元素的 Type
字段更新为“PABX
”
2) 更新 ContactNo
数组文档元素的 Type
字段,其 Number
字段等于“123
”为“Fiber
”
3) 更新Contact
数组的第一个元素并将其Type
字段设置为“Unknown
”
目前无法使用位置运算符更新数组中的所有项目。参见 this Whosebug question and this MongoDB issue。但是,如果您提前知道数组中元素的数量(或者可以通过某种方式获得),那么这将起作用:
var numberOfElementsInArray = 3; var filter = Builders<Contact>.Filter.Eq("Name", "Ken"); var update = Builders<Contact>.Update.Combine(Enumerable.Range(0, numberOfElementsInArray) .Select(i => Builders<Contact>.Update.Set("ContactNo." + i + ".Type", "PABX"))); collection.UpdateOneAsync(filter, update).Wait();
此代码将
ContactNo
数组中Number
为123
的元素的Type
属性 设置为Fiber
:var filter = Builders<Contact>.Filter.And( Builders<Contact>.Filter.Eq("Name", "Ken"), Builders<Contact>.Filter.Eq("ContactNo.Number", "123")); var update = Builders<Contact>.Update.Set("ContactNo.$.Type", "Fiber"); collection.UpdateOneAsync(filter, update).Wait();
此代码会将
ContactNo
数组中第一个元素的Type
属性 设置为Unknown
:var filter = Builders<Contact>.Filter.Eq("Name", "Ken"); var update = Builders<Contact>.Update.Set("ContactNo.0.Type", "Unknown"); collection.UpdateOneAsync(filter, update).Wait();
请注意,所有这些代码都假定您有一个名为 Contact
的 class 对应于您在问题中指定的数据(您的实际 class 可能被称为其他名称,我只是在这里称它为 Contact
),而 collection
是 IMongoCollection<Contact>
的一个实例。
例如:
var client = new MongoClient("mongodb://localhost:27017");
var collection = client.GetDatabase("your database").GetCollection<Contact>("your collection name");