繁体   English   中英

如何使用MongoDB c#驱动程序替换整个阵列

[英]how to replace the entire array using MongoDB c# driver

说,DB中的现有文档是这样的:

{
  "_id": "1",
  "settings": {
     "languages": [ "english", "french" ]
  }
}

现在,我想将文档更新为:

{
  "_id": "1",
  "settings": {
     "languages": [ "korean", "german" ]
  }
}

我厌倦了以下代码:

var lan = new List<string> { "finish", "russian", "korean" }   
collection.UpdateOne(
Builders<MyObject>.Filter.Eq("_id", "1"), 
Builders<MyObject>.Update.Set("settings.languages", lan));

但是出现以下异常:

MongoDB.Bson.Serialization.Serializers.EnumerableInterfaceImplementerSerializer 2[System.Collections.Generic.List 1 [System.String],System.String]'无法转换为类型'MongoDB.Bson.Serialization.IBsonSerializer`1 [System.String]

我还尝试使用BsonArray初始化新的语言数组:

var bsonArray = new BsonArray
{
    "korean",
    "german"
};

collection.UpdateOne(
Builders<MyObject>.Filter.Eq("_id", "1"), 
Builders<MyObject>.Update.Set("settings.languages", bsonArray));

可以正确执行更新,但是文档中的语言更改为:

{
  "_id": "1",
  "settings": {
     "languages": "[korean, german]"
  }
}

它变为"[ xx, xx ]" ,而不是[ "xx", "xx" ] 这不是我所期望的。

之所以收到该错误消息,是因为您在类型MyObject上使用强类型生成器,该类型可能看起来或多或少如下所示:

public class MyObject
{
    public string _id { get; set; }
    public Settings settings { get; set; }
}

public class Settings
{
    public string[] languages { get; set; }
}

因此,由于您拥有一个强类型化的Builder因此由于ListArray之间的类型不匹配而导致了异常。 解决该问题的两种方法:

使用列表中的.ToArray()来获得与MyObject相同的类型:

var lan = new List<string> { "finish", "russian", "korean" };
collection.UpdateOne(
    Builders<MyObject2>.Filter.Eq("_id", "1"),
    Builders<MyObject2>.Update.Set("settings.languages", lan.ToArray()));

或跳过使用BsonDocument类的类型验证:

var collection = mydb.GetCollection<BsonDocument>("col");
var lan = new List<string> { "finish", "russian", "korean" };
collection.UpdateOne(
    Builders<BsonDocument>.Filter.Eq("_id", "1"),
    Builders<BsonDocument>.Update.Set("settings.languages", lan));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM