[英]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.