首页 文章

如何使用C#Mongodb驱动程序类型方法更新数组文档元素的字段

提问于
浏览
2

使用带有Mongodb 3.0的MongoDB C#驱动程序版本2.0.1,是否可以使用类型化方法来更新数组字段文档元素?

例如,我有以下文件:

{
     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 " to be " Fiber

3)更新 Contact 数组的第一个元素,并将其 Type 字段设置为“ Unknown

1 回答

  • 2
    • 目前无法使用位置运算符更新数组中的所有项目 . 见this StackOverflow questionthis 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 数组中的元素的 Type 属性设置为 Number123Fiber
    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 的类,它对应于您在问题中指定的数据(您的实际类可能被称为其他类,我在这里称之为 Contact ),并且 collectionIMongoCollection<Contact> 的实例 .

    例如:

    var client = new MongoClient("mongodb://localhost:27017");
    var collection = client.GetDatabase("your database").GetCollection<Contact>("your collection name");
    

相关问题