Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongo C#驱动程序:反序列化BsonArray_C#_Mongodb - Fatal编程技术网

Mongo C#驱动程序:反序列化BsonArray

Mongo C#驱动程序:反序列化BsonArray,c#,mongodb,C#,Mongodb,我在mongodb中有一个文档的结构与此类似: { "_id":xxxxx, "business":[{ "subBusiness":[{ "subBusinessName":"Abusiness", "a":"aaaa" },{ "subBusinessName":"Bbusiness", "b":"bb

我在mongodb中有一个文档的结构与此类似:

{
    "_id":xxxxx,
    "business":[{
            "subBusiness":[{
                "subBusinessName":"Abusiness",
                "a":"aaaa"
            },{
                "subBusinessName":"Bbusiness",
                "b":"bbbbb",
                "c":"ccccc"
                }]
        }]
}
如何创建映射类来序列化此文档

我还定义了一个类来表示维度(上面的子文档)

类对象{
[BsonId]
公共对象id{get;set;}
[b单一元素(“业务”)]
公共列表业务列表{get;set;}
}
类别业务{
[B单一要素(“子业务”)]
公共列表子项{get;set;}
}
[BsonDiscriminator(RootClass=true)]
[BsonKnownTypes(类型(CSSubBusiness)、类型(ApprovSubbusiness))]
公共类子业务{
[BsonElement(“子业务名称”)]
公共字符串SubBusinessName{get;set;}
}
公共类ASUB业务:子业务{
[B单一元素(“a”)]
公共字符串A{get;set;}
}
公共类B子业务:子业务{
[b单一元素(“b”)]
公共字符串B{get;set;}
[b单一元素(“c”)]
公共字符串C{get;set;}
}
如何查询类STObject中的元素“b”?

为了查询,文档应该包含类型鉴别器字段,它告诉应该实例化哪种类型的子类。默认情况下,此字段的名称为
\u t
。但如果您已经有了如上模式的文档,并且无法更改它,那么您应该覆盖Mongo使用的鉴别器约定

看起来您可以使用
subBusinessName
字段作为子业务类型的类型鉴别器。为此,应从基本类型中删除此字段:

[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(AsubBusiness), typeof(BsubBusiness))] // btw check types
public class SubBusiness
{        
}
您应该为子类型提供鉴别器值:

[BsonDiscriminator("Abusiness")] // provide discriminator value here
public class AsubBusiness : SubBusiness
{
    [BsonElement("a")]
    public string A { get; set; }
}

[BsonDiscriminator("Bbusiness")]
public class BsubBusiness : SubBusiness
{
    [BsonElement("b")]
    public string B { get; set; }
    [BsonElement("c")]
    public string C { get; set; }
}
最后一步-创建自定义约定,使mongo查看此鉴别器字段以实例化正确的子类类型:

public class SubBusinessDiscriminatorConvention : IDiscriminatorConvention
{
    public string ElementName
    {
        get { return "subBusinessName"; }
    }

    public Type GetActualType(BsonReader bsonReader, Type nominalType)
    {
        var bookmark = bsonReader.GetBookmark();
        bsonReader.ReadStartDocument();
        var actualType = nominalType;
        if (bsonReader.FindElement(ElementName))
        {
            var discriminator = (BsonValue)BsonValueSerializer.Instance.Deserialize(bsonReader, typeof(BsonValue), null);
            actualType = BsonSerializer.LookupActualType(nominalType, discriminator);
        }
        bsonReader.ReturnToBookmark(bookmark);
        return actualType;
    }

    public BsonValue GetDiscriminator(Type nominalType, Type actualType)
    {
        var classMap = BsonClassMap.LookupClassMap(actualType);
        return classMap.Discriminator;
    }
}
现在为基类型序列化设置此约定:

BsonSerializer.RegisterDiscriminatorConvention(typeof(SubBusiness), 
    new SubBusinessDiscriminatorConvention());
您可以按您的确切格式序列化和反序列化文档

更新:查询:

var collection = test.GetCollection<STObject>("collectionName");
var sto = collection.FindOne(Query.EQ("_id", new ObjectId("xxxxx")));
var businessList = sto.BusinessList.FirstOrDefault();
var bsub = businessList.SubBuiness.OfType<BsubBusiness>().FirstOrDefault();
var b = bsub.B; // returns bbbbb
var collection=test.GetCollection(“collectionName”);
var sto=collection.FindOne(Query.EQ(“_id”,新ObjectId(“xxxxx”));
var businessList=sto.businessList.FirstOrDefault();
var bsub=businessList.SubBuiness.OfType().FirstOrDefault();
var b=b子项b;//返回bbbbb

非常感谢,如何查询BsubBusiness类中的元素“b”?
var collection = test.GetCollection<STObject>("collectionName");
var sto = collection.FindOne(Query.EQ("_id", new ObjectId("xxxxx")));
var businessList = sto.BusinessList.FirstOrDefault();
var bsub = businessList.SubBuiness.OfType<BsubBusiness>().FirstOrDefault();
var b = bsub.B; // returns bbbbb