将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)将Type
数组的所有元素的ContactNo
字段更新为" PABX
"
2)更新ContactNo
数组文档元素的Type
字段Number
字段等于" 123
"成为" Fiber
"
3)更新Contact
数组的第一个元素,并将其Type
字段设置为" Unknown
"
答案 0 :(得分:2)
目前无法使用位置运算符更新数组中的所有项目。请参阅this StackOverflow question和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();
此代码会将Type
数组中元素的ContactNo
属性设置为Number
123
到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();
此代码会将Type
数组中第一个元素的ContactNo
属性设置为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
的类,它对应于您在问题中指定的数据(您的实际类可能被称为其他类,我只是称之为Contact
这里)collection
是IMongoCollection<Contact>
的一个实例。
例如:
var client = new MongoClient("mongodb://localhost:27017");
var collection = client.GetDatabase("your database").GetCollection<Contact>("your collection name");