使用mongo C#驱动程序,如何序列化自定义对象数组以便存储它?

时间:2012-04-03 00:12:15

标签: c# mongodb mongodb-.net-driver

我有一个包含一系列文档的产品文档。例如

{
 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数组。

提前感谢您的帮助。

4 个答案:

答案 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文档的根级别。