【问题标题】:How to Convert List<T> to BsonArray to save a MongoDB Document如何将 List<T> 转换为 BsonArray 以保存 MongoDB 文档
【发布时间】:2016-10-13 16:58:29
【问题描述】:

我有一个模型类,我需要将它保存在 MongoDB 集合中。

我的模型课:

public Class Employee
{
    public string EmpID { get; set; }
    public string EmpName { get; set; }
    public List<Mobile> EmpMobile { get; set; }
}

public Class Mobile
{
    public string MobID { get; set; }
    public string MobNumber { get; set; }
    public bool IsPreferred { get; set; }
}

价值观是

Employee EmpInfo = new Employee()
{
    EmpID = "100",
    EmpName = "John",
    EmpMobile = new List<Mobile>()
    {
        { MobNumber = "55566610", IsPreferred = true },
        { MobNumber = "55566611", IsPreferred = false },
    }
}

BsonDocument _employee = new BsonDocument()
                             {
                                 { "Emp_ID", EmpInfo.EmpID },
                                 { "Emp_Name", EmpInfo.EmpName },
                                 { "Emp_Mobile", new BsonArray (EmpInfo.EmpMobile.Select(m => new 
                                     {
                                         MobID = new ObjectId(),
                                         MobNumber = m.MobNumber,
                                         IsPreferred = m.IsPreferred
                                     })) }
                             };

var collection = _database.GetCollection<BsonDocument>("EmployeeInfo");
collection.InsertOne(_employee);

我希望将上述 EmpInfo 类型的 Employee 保存在 MongoDB 中。但我无法创建 BsonDocument。如果上面的代码有什么问题,请帮助我。如果是,请帮助我。

【问题讨论】:

  • 什么是employee.Email?可以试试改成EmpInfo.EmpMobile.Select(...)吗?
  • 对不起,它是 EmpMobile。打字错误。现在检查帖子,我编辑了错误。
  • 这个集合是专门用来存储Employee 数据的吗?

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


【解决方案1】:

除了上面的答案,如果你出于某种原因想直接与 Bson 打交道,我可以建议以下代码:

BsonDocument _employee = new BsonDocument()
{
    { "Emp_ID", EmpInfo.EmpID },
    { "Emp_Name", EmpInfo.EmpName },
    { "Emp_Mobile", BsonArray.Create(EmpInfo.EmpMobile.Select(m => new BsonDocument()
        {
            { "MobID" , new ObjectId() },
            { "MobNumber", m.MobNumber },
            { "IsPreferred", m.IsPreferred }
        })) }
};

您遇到错误的原因是BsonArray.Create 创建了一个值数组,而不是对象数组。详情请见this question

【讨论】:

    【解决方案2】:

    无需序列化为bson文档 您可以使用 TYPED 集合并仅插入数据 请参阅更新的类结构的附加代码片段

    void Main()
    {
        // To directly connect to a single MongoDB server
        // or use a connection string
        var client = new MongoClient("mongodb://localhost:27017");
        var database = client.GetDatabase("test");      
    
    var collectionEmpInfo = database.GetCollection<Employee>("Employee");
    
    Employee EmpInfo = new Employee
    {       
        EmpID = "100",
        EmpName = "John",
        EmpMobile = new List<Mobile>
        {
            new Mobile{ MobNumber = "55566610", IsPreferred = true, MobID = ObjectId.GenerateNewId() },
            new Mobile{ MobNumber = "55566611", IsPreferred = false, MobID = ObjectId.GenerateNewId() },
        }
    };
    
    collectionEmpInfo.InsertOne(EmpInfo);
    var empList = collectionEmpInfo.Find(new BsonDocument()).ToList();
    empList.Dump(); //dump is used in linqPad
    
    }
    
    public class Employee
    {
       public ObjectId Id  { get; set; }
        public string EmpID { get; set; }
        public string EmpName { get; set; }
        public List<Mobile> EmpMobile { get; set; }
    }
    
    public class Mobile
    {
        public ObjectId MobID { get; set; }
        public string MobNumber { get; set; }
        public bool IsPreferred { get; set; }
    }
    

    【讨论】:

    • 请告诉我更多信息。如何在 MongoDB 文档中添加 DateTime。现在我正在使用 new DateTime() 但在 MongoDB 中它显示 -62135596800000。
    • @IRPunch 我在Employee中添加了CreatedAt字段,初始化CreatedAt = DateTime.Now,看起来不错
    • 我在 mongodb 中还有两个问题 - 你能帮我吗 1.Where Clause in Embedded Document 2.Insert Many Document
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多