[英]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
因此由于List
和Array
之间的类型不匹配而导致了异常。 解决该问题的两种方法:
使用列表中的.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.