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