首页 > 解决方案 > MongoDB Driver C# 仅反序列化对象内的一半对象键

问题描述

当我使用 MongoDB Driver 2.10 从 MongoDB 数据库加载(/反序列化)对象时,会出现我遇到的问题。当我这样做时,只有一半的模型对象 - 由于某种原因(第 2、第 4、第 6 等)只有偶数对象 - 在 c# 类的 Channel 字典中获取值。

我有一个带有用户对象的 MongoDB 集合。用户对象如下所示:

{
    "_id" : ObjectId("5bedfd60502d2c2854d43e6f"),
    "displayName" : "User",
    "channels" : {
        "YouTube" : "userchannel",
        "Facebook" : "userchannel",
        "Instagram" : "userchannel",
        "Twitter" : "userchannel"
    }
}

所有用户对象在通道对象中都有有效值

该集合由以下代码加载:

_userCollection = DatabaseService.GetConnection().GetCollection<User>("users");

用户类如下所示:

public class User
{
    public ObjectId Id { get; set; }

    [BsonElement("displayName")]
     public string DisplayName { get; set; }

    [BsonElement("channels")]
     public BsonDocument channelsDocument { get; set; }}

最后,当我打印每个 Usermodel 对象的信息时,只有一半的 Usermodel 有通道。如果我从集合中单独获得第一个、第三个等,它们仍然没有渠道价值..

我错过了什么吗?我已经尝试了几个小时了..

标签: c#asp.net-mvcmongodb

解决方案


更改此行:

_userCollection = DatabaseService.GetConnection().GetCollection<User>("users"); 

至:

_userCollection = DatabaseService.GetConnection().GetCollection<User>("users")
    .Find(Builders<User>.Filter.Empty).ToList();

下面的例子可以在 LINQPad 上进行测试(我认为它更具可读性):

void Main()
{
    var context = new MongoContext();
    var filter = Builders<User>.Filter.Empty; // Finds all
    //var filter = Builders<User>.Filter.Eq(x => x.Id, ObjectId.Parse("5bedfd60502d2c2854d43e6f"));
    var users = context.User.Find(filter).ToList();
    users.Dump();
}

public class MongoContext
{
    private static readonly IMongoDatabase Database;
    static MongoContext()
    {
        var connectionString = "mongodb://localhost:27017";
        IMongoClient client = new MongoClient(connectionString);
        Database = client.GetDatabase("your_databse_name");
    }

    public IMongoCollection<User> User =>
        Database.GetCollection<User>("your_collection_name");
}

推荐阅读