2016-09-22 46 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的ID列表,然後我選擇,我要與數據插入新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) 
          ); 
    } 

Bu它看起來我的代碼不工作,所以幫助嗎?

更新 添加再用ntohl的 我面對這個問題的代碼後,當我嘗試插入收集 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

我有一點點的優勢在這裏,因爲我已經回答了你以前的帖子,和我可以用它作爲基礎。我還添加了集合初始化部分,因爲元素的類型很重要。例如,您需要在SymbolesListBox.ItemsSource中有SymboleCls。 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中不要忘記將Winforms的DisplayMemberPath eqvivalent設置爲名稱 – Juste3alfaz

+0

我使用了WPF,因此我將視圖上的UsersComboBox.DisplayMemberPath設置爲Name。你使用winforms/telerik,所以你需要將'UsersComboBox.DisplayMember'設置爲Name。 – ntohl

+0

將UsersComboBox.DisplayMember設置爲名稱? §什麼名稱?工具還是什麼?我不使用telerik – Juste3alfaz