2016-09-22 3 views
1

를 ID를 찾을 수 및 수집에 BsonArray을 삽입 내가이 컬렉션MongoDB를

db.UserWatchtbl.insert({ 
fbId: "", 
Name: "user3", 
pass: "pass3", 
Watchtbl: 
    [ 
     { 
     wid: "1350", 
     name: "bought stock1", 
     Symboles: [ { Name: "AAA" }, { Name: "BSI" } ] 
     }, 
     { 
     wid: "1350", 
     name: "bought stock2", 
     Symboles: [ { Name: "AAA" }, { Name: "BSI" }, { Name: "EXXI" } ] 
     }, 
     { 
     wid: "1350", 
     name: "bought stock2", 
     Symboles: [ { Name: "AAA" }, { Name: "BSI" }, { Name: "EXXI" } ] 
     } 
    ] 
}) 

내 폼이 MongoDB를에서 아이디 목록을로드에게이 다음 나는 데이터와 새로운 WatchTbl을 삽입 할 ID를 선택합니다. 그리고 ID를 찾으려고 시도한 후 Watchtbl 데이터에 삽입합니다.

private async void button1_Click(object sender, EventArgs e) 
    { 
     // add user into datagridview from MongoDB Colelction Watchtbl 
     var client = new MongoClient("mongodb://dataservername:27017"); 

     var database = client.GetDatabase("WatchTblDB"); 
     var collectionWatchtbl = database.GetCollection<BsonDocument>("UserWatchtbl"); 

     var document = new BsonDocument(); 
     BsonArray arrSym = new BsonArray(); 
     BsonArray arrWatc = new BsonArray(); 

     document.Add("wid", WIDTextBox.Text.ToString()); 
     document.Add("name", NameComboBox.SelectedItem.ToString()); 

     foreach (var item in SymbolesListBox.SelectedItems) 
     { 
      arrSym.Add(new BsonDocument("Name", item.ToString())); 
     } 
     document.Add("Symboles", arrSym); 

     arrWatc.Add(new BsonDocument("Watchtbl", document)); 



     var result = await collectionWatchtbl.FindOneAndUpdateAsync(
          Builders<BsonDocument>.Filter.Eq("_id", UsersComboBox.SelectedItem.ToString()), 
          Builders<BsonDocument>.Update.Set("Watchtbl", arrWatc) 
          ); 
    } 

부 내 코드가 작동하지 않는 것처럼 보입니다. 내가 당신의 이전 게시물 대답 때문에 내가 여기에 약간의 이점을 가지고 enter image description here

+1

만약 내가 제대로 이해하고, 결과는 같을 것이다 "{... Watchtbl : [{...}, {...} {...}, ]} "을 가진 새로운 문서. 이 경우 UserWatchtbl 크기가 변경된 것보다 커야합니다 (모자라기 쉬운 컬렉션에서는 [불가능] (https://docs.mongodb.com/manual/core/capped-collections/)). db.createCollection ("UserWatchtbl", {capped : false})와 함께 컬렉션을 다시 만드십시오. – ntohl

+0

네, 캡슐 처리되지 않은 다른 콜렉션으로 테스트하고 작동합니다 : D – Juste3alfaz

답변

1

, 및 수집에 삽입 할 때

업데이트 은 후 나는이 문제에 직면 ntohl의 코드를 추가합니다 베이스로 사용할 수 있습니다. 요소의 유형이 중요하기 때문에 컬렉션 초기화 부분도 추가했습니다. 예를 들어 SymbolesListBox.ItemsSourceSymboleCls을 입력해야 사용할 수 있습니다. 그리고 UsersComboBox는 ObjectId이어야합니다. Update.Set을 사용하는 경우 전체 배열을 만들 필요가 없으며 이전 요소를 채울 필요가 있습니다. 대신 AddToSet을 사용했습니다.

private readonly IMongoCollection<BsonDocument> collectionWatchtbl; public MainWindow() { InitializeComponent(); var client = new MongoClient("mongodb://localhost:27017"); var database = client.GetDatabase("test"); collectionWatchtbl = database.GetCollection<BsonDocument>("UserWatchtbl"); var filter = new BsonDocument(); var user = new List<UserWatchTblCls>(); var cursor = collectionWatchtbl.FindAsync(filter).Result; cursor.ForEachAsync(batch => { user.Add(BsonSerializer.Deserialize<UserWatchTblCls>(batch)); }); UsersComboBox.ItemsSource = user.Select(x => x.Id); SymbolesListBox.DisplayMember = "Name"; SymbolesListBox.ItemsSource = user.SelectMany(x => x.WatchTbls).SelectMany(y => y.Symbols); } private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { var document = new BsonDocument(); BsonArray arrSym = new BsonArray(); //BsonArray arrWatc = new BsonArray(); document.Add("wid", WIDTextBox.Text.ToString()); document.Add("name", NameComboBox.SelectedItem.ToString()); foreach (SymboleCls item in SymbolesListBox.SelectedItems) { arrSym.Add(new BsonDocument("Name", item.Name)); } document.Add("Symboles", arrSym); // needed only when replacing the Watchtbl //arrWatc.Add(document); // Do You really need to use async? collectionWatchtbl.UpdateOne(Builders<BsonDocument>.Filter.Eq("_id", UsersComboBox.SelectedItem), Builders<BsonDocument>.Update.AddToSet("Watchtbl", document)); } 

및 역 직렬화에 대한 POCO 클래스

>

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

    public string fbId { get; set; } 
    public string Name { get; set; } 

    [BsonElement("pass")] 
    public string Pass { get; set; } 

    [BsonElement("Watchtbl")] 
    public List<WatchTblCls> WatchTbls { get; set; } 
} 

public class WatchTblCls 
{ 
    [BsonElement("wid")] 
    public string WID { get; set; } 

    [BsonElement("name")] 
    public string Name { get; set; } 

    [BsonElement("Symboles")] 
    public List<SymboleCls> Symbols { get; set; } 
} 

public class SymboleCls 
{ 
    public string Name { get; set; } 
} 
+0

이 부분을 이해할 수 없습니다. // UsersComboBox에서 DisplayMemberPath를 Winforms의 Equqvivalent를 Name으로 설정하는 것을 잊지 마십시오. – Juste3alfaz

+0

WPF를 사용했기 때문에 뷰에서 'UsersComboBox.DisplayMemberPath'를 Name으로 설정했습니다. winforms/telerik을 사용하기 때문에'UsersComboBox.DisplayMember'를 Name으로 설정해야합니다. – ntohl

+0

UsersComboBox.DisplayMember를 Name으로 설정 하시겠습니까 ??? § 이름? 도구 또는 무엇? 여기서는 telerik을 사용하지 않습니다. – Juste3alfaz