我有一个包含一系列文档的产品文档。例如
{
id: 1,
name: "J-E-L-L-O",
store:[{id: 1,
name: "Store X"},
{id: 2,
name: "Store Y"}]
}
我想将“Store Y”的名称更改为“Store 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数组。
提前感谢您的帮助。
答案 0 :(得分:7)
不幸的是我遇到了同样的问题,并最终制作了一个扩展方法来帮助我解决它。
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()));
答案 1 :(得分:2)
异常表示您无法将数组/列表转换为BsonDocument。我认为您希望将storeList
转换为[BsonArray][1]
。
如果storeList
已经是BsonDocument
或某些IEnumerable<T>
的数组,可以转换为BsonDocument
,那么您不需要强制转换storeList
完全没有变量。
答案 2 :(得分:0)
你应该使用
BsonDocument.Parse(storeList);
而不是
storeList.ToBsonDocument()
答案 3 :(得分:0)
对接受的答案功能进行少量编辑:
public static BsonArray ToBsonDocumentArray(this IEnumerable list)
{
var array = new BsonArray();
foreach (var item in list)
{
array.Add(item);
}
return array;
}
我们不需要转换item.ToBson()。已经存在从字符串到bson的隐式转换。这就是我收到错误消息的原因“字符串值无法写入BSON文档的根级别。”