BSonElement到c#数据类型

时间:2012-02-24 18:10:36

标签: mongodb mongodb-.net-driver

我的数据库中有一个“BSonElement”,我使用标准查询重试它。

问题在于我无法将BsonDocument转换为Type。

示例:

更新1:

 public partial class item_Stat
{

    [BsonExtraElements]
    public BsonDocument all_stat;
}

基本上,我已经进入了我的DB 10-15属性(字段),我可以用“BsonExtraElements”阅读。通过这种方式,我可以在不定义属性的情况下重试属性 在C#。

all_stat,可以有10-15-20属性改变。 C#是类型语言,因此我无法在C#中定义此属性,并且我使用了ExtraElements。

问题是当我从DB查询对象时。

var item_db = myMongoCollection.find(theQuery); // find the OBJECT

item_db.all_stat // all the property hare HERE

// find the property "category_01"
var i =  item_db.all_stat.Where(p => p.Name == "category_01").Single();

// ok, i have found the Category, so i can cast it to C# Data Type    
var typed_value = (ItemStatSingle) i.Value // BsonElement to ItemStatSingle

3 个答案:

答案 0 :(得分:5)

以下是您可以执行的操作示例,给出了域模型中的类,如:

public class Employee
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}

您可以像这样使用您的课程:

var collection = database.GetCollection<employee>("employees");

var employee = new Employee { Name = "John Smith" };
collection.Insert(employee);

employee = collection.FindOne();</employee>

答案 1 :(得分:5)

BsonElement.Value的类型为BsonValue。使用As *方法之一进行适当的转换。这里的价值是什么类型的?由于您拥有用户定义的类型,因此最佳选择是检索Barrie上面所说的。如果你想自定义&#34;映射&#34;请参阅序列化教程http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial

答案 2 :(得分:2)

您不能只从额外元素中投射BsonDocument。你必须反序列化它。

假设你有一个C类

public class C
{
    public int X;
}

和一个extraDocuments变量(类似于你的item_db.all_stat属性)初始化如下:

var extraElements = new BsonDocument();
var c = new C { X = 1 };
extraElements["c"] = c.ToBsonDocument();

然后你可以提取“c”值并反序列化它:

var r = BsonSerializer.Deserialize<C>(extraElements["c"].AsBsonDocument);
Console.WriteLine(r.ToJson());