【问题标题】:How to use C# Mongodb driver typed methods Update fields of array document elements如何使用 C# Mongodb 驱动类型化方法更新数组文档元素的字段
【发布时间】:2015-08-07 11:53:03
【问题描述】:

将 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) 将Number 字段等于“123”的ContactNo 数组文档元素的Type 字段更新为“Fiber

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

【问题讨论】:

    标签: c# arrays mongodb mongodb-csharp-2.0


    【解决方案1】:
    1. 目前无法使用位置运算符更新数组中的所有项目。请参阅 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();
      
    2. 此代码会将ContactNo 数组中元素的Type 属性设置为123NumberFiber

      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. 这段代码会将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&lt;Contact&gt; 的一个实例。

    例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多