簡體   English   中英

查找 Id 並將 BsonArray 插入到集合 MongoDB 中

[英]Find Id and insert a BsonArray into collection 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)
                            );
    }

但是看起來我的代碼不起作用,所以有什么幫助嗎?

添加ntohl代碼后更新我在嘗試插入集合時遇到此問題在此處輸入圖片說明

我在這里有一點優勢,因為我已經回答了您之前的帖子,我可以將其用作基礎。 我還添加了集合初始化部分,因為元素的類型很重要。 例如,您需要在SymbolesListBox.ItemsSourceSymboleCls才能使其工作。 並且 UsersComboBox 必須有ObjectId s。 如果您使用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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM