将BsonDocument反序列化为POCO时的属性为null - mongo .net核心驱动程序

时间:2017-10-02 21:31:46

标签: mongodb asp.net-core .net-core asp.net-core-2.0

我创建了一个POCO,我尝试从mogodb序列化它 显然我创建了与Mongo元素完全相同的类

我只使用此代码

            MongoClient client = new MongoClient("mongodb://ip:port");
            IMongoDatabase database = client.GetDatabase("envbas");
            BsonClassMap.RegisterClassMap<Life>(cm => 
            {
              cm.AutoMap();
              cm.SetIgnoreExtraElements(true);

            });
            var filter = Builders<Life>.Filter.Eq(life => life.Fl_status, "A");
            var lives = database.GetCollection<Life>("lives").Find(filter).ToList();

使用此代码,它会在生命变量(List)上向我返回0行

当我尝试使用BsonDocument类型

查找所有元素时,它只会重新调整某些内容
var lives = database.GetCollection<BsonDocument>("lives").Find(new BsonDocument()).ToList();

但我需要将它转换为Life对象,所以我不能使用BsonDocument类

2 个答案:

答案 0 :(得分:2)

使用cm.SetIgnoreExtraElements(true);

您需要定义此Fl_status:

[BsonIgnoreExtraElements]
public class Life
{
    [BsonElement("fl_status")]
    public string Fl_status { get; set; }
}

或者您可以删除BsonClassMap.RegisterClassMap<Life>,并使用此过滤器:

var filter = Builders<BsonDocument>.Filter.Eq("Fl_status", "A");

答案 1 :(得分:0)

我只需要在我的属性类

中添加一些符号

我的POCO

[BsonIgnoreExtraElements]
    public class Life
    {
        [BsonId]
        [BsonElement("")]
        public ObjectId Id { get; set; }

        //public ObjectId __v { get; set; }

        [BsonElement("ds_atividade")]
        public string Ds_atividade { get; set; }

        [BsonElement("cd_cbo")]
        public string Cd_cbo { get; set; }

        [BsonElement("nm_funcao")]
        public string Nm_funcao { get; set; }

        [BsonElement("cd_interno_funcao")]
        public string Cd_interno_funcao { get; set; }
        [...]
    }

我的最终代码

 MongoClient client = new MongoClient("mongodb://ip:port");
 IMongoDatabase database = client.GetDatabase("envbas");
 var filter = Builders<Life>.Filter.Eq("fl_status", "Ativo"); //Eq("Mongo propertie", "value")
 var lives = database.GetCollection<Life>("lives").Find(filter).ToListAsync().GetAwaiter().GetResult();

现在我可以在我的生活变量中获得一个列表。 我想如果你想使用符号的Fluent API,你可以使用mapping

BsonClassMap.RegisterClassMap<MyClass>(cm => 
{
    cm.MapMember(c => c.SomeProperty);
    cm.MapMember(c => c.AnotherProperty);
});