Используя драйвер Mongo С#, как сериализовать массив пользовательского объекта, чтобы его сохранить?
У меня есть документ продукта, содержащий массив документов. Например
{
id: 1,
name: "J-E-L-L-O",
store:[{id: 1,
name: "Store X"},
{id: 2,
name: "Store Y"}]
}
Я хотел бы, например, изменить имя "Store Y" для сохранения Z. В то время я не знаю индекс объекта. Поэтому я вытягиваю весь массив, нахожу объект в обновить, изменить имя, а затем попытаться установить значение "store" с обновленным массивом.
productCollection.Update(query, Update.Set("store", storeList.ToBsonDocument()));
Однако я получаю сообщение об ошибке: "An Array value cannot be written to the root level of a BSON document."
Я думаю, мне просто нужно знать, как сериализовать массив настраиваемых объектов в массив BsonDocuments.
Заранее благодарим за помощь.
Ответы
Ответ 1
К сожалению, у меня была такая же проблема, и я решил создать метод расширения, чтобы помочь мне обойти его.
public static BsonArray ToBsonDocumentArray(this IEnumerable list)
{
var array = new BsonArray();
foreach (var item in list)
{
array.Add(item.ToBson());
}
return array;
}
чтобы вы могли:
productCollection.Update(query, Update.Set("store", storeList.ToBsonDocumentArray()));
Ответ 2
В исключении указано, что вы не можете преобразовать массив/список в BsonDocument. Я думаю, что вы хотите преобразовать storeList
в [BsonArray][1]
.
Если storeList
уже является массивом BsonDocument
или некотором IEnumerable<T>
, где можно преобразовать в BsonDocument
, вам не нужно вообще вводить переменную storeList
.
Ответ 3
Небольшое редактирование для принятой функции ответа:
public static BsonArray ToBsonDocumentArray(this IEnumerable list)
{
var array = new BsonArray();
foreach (var item in list)
{
array.Add(item);
}
return array;
}
нам не нужно преобразовывать item.ToBson(). Существует уже неявное преобразование из строки в bson.Thats причина, по которой я получал сообщение об ошибке " Значение String не может быть записано на корневой уровень документа BSON."
Ответ 4
вы должны использовать
BsonDocument.Parse(storeList);
вместо
storeList.ToBsonDocument()