2016-06-13 10 views
3

私はモデルクラスを持っています。私はMongoDBコレクションに保存する必要があります。MongoDBドキュメントを保存するために<T>をBsonArrayに変換する方法

私のモデルクラス:

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; } 
} 

値が、私はタイプのMongoDBでEmployeeEmpInfo上記を保存したい

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); 

です。しかし、BsonDocumentを作成することはできません。上のコードに何か間違いがあることを親切に助けてください。はいの場合は親切に私を助けてください。 入力したコレクションを使用してデータだけを挿入することができBSON文書にシリアライズする必要はありません

+0

「employee.Email」とは何ですか?それを 'EmpInfo.EmpMobile.Select(...)'に変更してみてください。 –

+0

申し訳ありません、それはEmpMobileです。タイプミス。今投稿をチェックし、私は間違いを編集しました。 –

+0

は 'Employee 'データを保存するための専用コレクションですか? – profesor79

答えて

2

更新クラス構造を持つ添付コードsnipetを参照してください上記の答えに加えて

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; } 
} 

screenshot from LinqPad

+0

さらに詳しい情報をお知らせください。 MongoDB DocumentにDateTimeを追加するにはどうすればいいですか?今は新しいDateTime()を使用していますが、MongoDBでは-62135596800000を示しています。 –

+0

@ IRPunch私はEmployeesのCreatedAtフィールドを初期化CreatedAt = DateTime.Nowという形で追加しました。それはよさそうです – profesor79

+0

私はmongodbでさらに2つの質問をしています。 ://stackoverflow.com/questions/37801269/step-by-step-single-where-clause-query-in-a-embedded-document-of-mongodb-collect)2. [Insert Many Document](http:///stackoverflow.com/questions/37802690/insertmany-document-in-a-mongodb-collection-using-c-sharp-bsonarray) –

0

何らかの理由で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を参照してください。

関連する問題