Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找Id并将BsonArray插入集合MongoDB_C#_Mongodb_Winforms - Fatal编程技术网

C# 查找Id并将BsonArray插入集合MongoDB

C# 查找Id并将BsonArray插入集合MongoDB,c#,mongodb,winforms,C#,Mongodb,Winforms,我有这个收藏 db.UserWatchtbl.insert( { fbId: "", Name: "user3", pass: "pass3", Watchtbl: [ { wid: "1350", name: "bought stock1", Symboles: [ { Name: "AAA" }, { Name: "BSI" } ] }, { wid

我有这个收藏

    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)
                            );
    }
private async void按钮1\u单击(对象发送方,事件参数e)
{
//从MongoDB collection Watchtbl将用户添加到datagridview
var客户端=新的MongoClient(“mongodb://dataservername:27017");
var database=client.GetDatabase(“WatchTblDB”);
var collectionWatchtbl=database.GetCollection(“UserWatchtbl”);
var document=新的BsonDocument();
BsonArray arrSym=新的BsonArray();
BsonArray arrWatc=新的BsonArray();
document.Add(“wid”,WIDTextBox.Text.ToString());
document.Add(“name”,NameComboBox.SelectedItem.ToString());
foreach(符号列表框中的变量项。选择编辑项)
{
arrSym.Add(新的BsonDocument(“Name”,item.ToString());
}
文件。添加(“符号”,arrSym);
arrWatc.添加(新的BsonDocument(“Watchtbl”,文件));
var result=await collectionWatchtbl.FindOneAndUpdateAsync(
Builders.Filter.Eq(“\u id”,UsersComboBox.SelectedItem.ToString()),
Builders.Update.Set(“Watchtbl”,arrWatc)
);
}
但是我的代码似乎不起作用,有什么帮助吗

更新 添加ntohl的代码后 当我尝试插入到集合中时,我会遇到这个问题
我在这里有一点优势,因为我已经回答了你以前的帖子,我可以把它作为一个基础。我还添加了集合初始化部分,因为元素的类型很重要。例如,您需要在
SymbolesListBox.ItemsSource
中包含
SymboleCls
。和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));
}
专用只读IMongoCollection collectionWatchtbl;
公共主窗口()
{
初始化组件();
var客户端=新的MongoClient(“mongodb://localhost:27017");
var database=client.GetDatabase(“测试”);
collectionWatchtbl=database.GetCollection(“UserWatchtbl”);
var filter=新的BsonDocument();
var user=新列表();
var cursor=collectionWatchtbl.FindAsync(filter.Result);
cursor.ForEachAsync(批处理=>
{
添加(BsonSerializer.Deserialize(batch));
});
UsersComboBox.ItemsSource=user.Select(x=>x.Id);
SymbolesListBox.DisplayMember=“Name”;
SymboleListBox.ItemsSource=
user.SelectMany(x=>x.WatchTbls)。SelectMany(y=>y.Symbols);
}
private void按钮base_OnClick(对象发送方,RoutedEventTarget e)
{
var document=新的BsonDocument();
BsonArray arrSym=新的BsonArray();
//BsonArray arrWatc=新的BsonArray();
document.Add(“wid”,WIDTextBox.Text.ToString());
document.Add(“name”,NameComboBox.SelectedItem.ToString());
foreach(符号列表框中的符号项。选择编辑项)
{
arrSym.Add(新的B文件(“名称”,项目名称));
}
文件。添加(“符号”,arrSym);
//仅在更换手表时需要TBL
//arrWatc.Add(文件);
//你真的需要使用异步吗?
collectionWatchtbl.UpdateOne(Builders.Filter.Eq(“\u id”,UsersComboBox.SelectedItem),Builders.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; }
}
公共类UserWatchTblCls
{
[BsonId]
[b单一元素(“_id”)]
公共对象Id{get;set;}
公共字符串fbId{get;set;}
公共字符串名称{get;set;}
[b单一元素(“通过”)]
公共字符串传递{get;set;}
[BsonElement(“Watchtbl”)]
公共列表WatchTbls{get;set;}
}
公共类监视TBLCLS
{
[B单一元素(“wid”)]
公共字符串WID{get;set;}
[b单一元素(“名称”)]
公共字符串名称{get;set;}
[b单一元素(“符号”)]
公共列表符号{get;set;}
}
公共类符号
{
公共字符串名称{get;set;}
}

我不理解这部分,//在UsersComboBox中,不要忘记将Winforms的DisplayMemberPath eqvivalent设置为Name我使用了WPF,因此我将视图上的
UsersComboBox.DisplayMemberPath
设置为Name。您使用winforms/telerik,因此需要将
UsersComboBox.DisplayMember
设置为Name。将UsersComboBox.DisplayMember设置为Name???§什么名字?工具还是什么?我不使用telerikhere@Juste3alfaz抱歉
SymbolesListBox.displaymber=“Name”
。[您可以看到,DisplayMember定义了将在列表中显示的属性。因此您可以将
SymboleCls
对象作为
ItemsSource
。如果我理解正确,结果将类似于“{…Watchtbl:[{…},{…},{…},{…},]}”。如果是这种情况,则UserWatchtbl会更改大小,这是在一个有上限的集合中。请使用db.createCollection(“UserWatchtbl”,{capped:false})重新创建该集合是的,就是这样,我使用另一个没有上限的集合进行测试,结果是:D