2

将 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所有元素的字段更新为“ ”ContactNoPABX

2)ContactNo将数组文档元素中字段等于“ ”的Type字段更新为“ ”Number123Fiber

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

4

1 回答 1

2
  1. 目前无法使用位置运算符更新数组中的所有项目。请参阅此 StackOverflow 问题此 MongoDB 问题。但是,如果您提前知道数组中的元素数量(或者可以通过某种方式获得),那么这将起作用:

    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();
    
  2. 此代码将使用to设置数组中元素的Type属性:ContactNoNumber123Fiber

    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();
    
  3. 此代码将数组Type中第一个元素的属性设置为:ContactNoUnknown

    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");
于 2015-08-07T13:30:42.290 回答