vs2019下用vb.net窗体程序连接mongodb4.2 [数据库教程]
说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始。幸亏有很多天才,成功破译,我才得以沿着他们走的路,照猫画虎的走下去。整个项目结构如下:
- 类文件中vbtest.vb数据库实体类对应着mongodb文档vbtest,用于数据操作测试
Imports MongoDB.BsonPublicClass vbtestPublic _id As ObjectIdPublic content AsStringEnd Class
- (optional)vbmongo.vb是绑定好数据库实体类vbtest的版本
Imports MongoDB.BsonImports MongoDB.DriverPublicClass vbmongoPublic clientPublic collection As IMongoCollection(Of vbtest)Public database As IMongoDatabasePublic mlist As List(Of vbtest)Public builder As FilterDefinitionBuilder(Of vbtest) = New FilterDefinitionBuilder(Of vbtest)PublicfilterAs FilterDefinition(Of vbtest)PublicSubNew(ByVal dbname AsString, ByVal collectionname AsString)client
= New MongoClient("mongodb://127.0.0.1:27017")database
= client.GetDatabase(dbname)collection
= database.GetCollection(Of vbtest)(collectionname)End SubPublic Async Function loadrecords() As Task(Of List(Of vbtest))
filter = builder.Ne(Of ObjectId)("_id", New ObjectId())//_id不等于空的记录,通过这种方法蹩脚的实现了查找全部的功能Builder的大多数条件设置函数都用到了泛型Ne(Of TField)
Dim mlist As List(Of vbtest) = Await collection.Find(filter).ToListAsync()//TField可以理解为 type of field 对应的是实体类中字段的数据类型例如 OBjectId或者String等等
Return mlist
End Function
Public Async Function loadone(ByVal _id AsString) As Task(Of vbtest)
filter = builder.Eq(Of ObjectId)("_id", New ObjectId(_id))
Dim mlist As vbtest = Await collection.Find(filter).FirstOrDefaultAsync()
Return mlist
End Function
Public Async Function updateone(ByVal _id AsString, ByVal doc As vbtest) As Task(Of vbtest)
filter = builder.Eq(Of ObjectId)("_id", New ObjectId(_id))
Dim up As UpdateDefinitionBuilder(Of vbtest) = New UpdateDefinitionBuilder(Of vbtest)()
Dim updef As UpdateDefinition(Of vbtest)
updef = up.Set(OfString)("content", doc.content)
‘.Set(Of String)("content", doc)
collection.UpdateOneAsync(filter, updef)
End Function
End Class
说起来mongodb的连接可以分几步,根据连接字符串打开链接,获取数据库,获取文档,进而在文档的基础上进行增删改查。对于vb.net操作mongodb,完全是根据c#的操作范例,根据vb.net的语法特点临摹出来的。
首先需要对项目进行Nuget包的安装,我们要搜寻的是MongoDB.Driver
- 这里创建了一个vb.net 的 泛型类vbmongoT,只写了单个查找,查找列表和更新操作,函数中大量成对出现了Async和Await关键字,用于标识该功能使用了异步编程,在窗体程序中进行调用的时候,仍需要在成对的使用Async Await的关键字,因为异步函数返回的往往是Task<TResult>类型(c#)或者 Task(Of TResult) (vb.net)需要在调用函数体中使用await关键字拿到最终结果Imports MongoDB.BsonImports MongoDB.Driver
PublicClass vbmongoT(Of T)Public clientPublic collection As IMongoCollection(Of T)Public database As IMongoDatabasePublic mlist As List(Of T)Public builder As FilterDefinitionBuilder(Of T) = New FilterDefinitionBuilder(Of T)Public up As UpdateDefinitionBuilder(Of T)Public updef As UpdateDefinition(Of T)PublicfilterAs FilterDefinition(Of T)PublicSubNew(ByVal dbname AsString, ByVal collectionname AsString)client
= New MongoClient("mongodb://127.0.0.1:27017")database
= client.GetDatabase(dbname)collection
= database.GetCollection(Of T)(collectionname)End SubPublic Async Function loadrecords() As Task(Of List(Of T))
filter = builder.Ne(Of ObjectId)("_id", New ObjectId())
Dim mlist As List(Of T) = Await collection.Find(filter).ToListAsync()
Return mlist
End Function
Public Async Function loadone(ByVal _id AsString) As Task(Of T)
filter = builder.Eq(Of ObjectId)("_id", New ObjectId(_id))//_id满足查找条件的记录,Builder的大多数条件设置函数都用到了泛型:例如Ne(Of TField)
Dim mlist As T = Await collection.Find(filter).FirstOrDefaultAsync()
Return mlist
End Function
Public Async Function updateone(ByValfilterAs FilterDefinition(Of T), ByVal updef As UpdateDefinition(Of T)) As Task(Of T)
‘updef = up.Set(Of String)("content", doc.content)‘.Set(Of String)("content", doc)
Await collection.UpdateOneAsync(filter, updef)
End Function
End Class
在mongodb这一版本的官方API里,IMongoCollection对象是查找,添加,更新,删除等动作的发起者,这里面查找,更新,删除都要用到查询条件,
官方谓之filter(过滤器)C#: FilterDefinition<T> VB.net: FilterDefinition (Of T)
而过滤器是过滤器模具的建模结果
过滤器模具:C#: FilterDefinitionBuilder<T> VB.net: FilterDefinitionBuilder (Of T)
在Mongodb.Driver这个大类下面 建议直接翻看FilterDefinitionBuilder的介绍 https://mongodb.github.io/mongo-csharp-driver/2.10/apidocs/html/T_MongoDB_Driver_FilterDefinitionBuilder_1.htm
同样的数据库文档的更新操作由 UpdateDefinitionBuilder 设置更新字段后产生的 UpdateDefinition完成
- 窗体程序部分
Imports MongoDB.BsonImports MongoDB.DriverPublicClass Form1Public clientPublic bsdoc As vbtestPublic collection As IMongoCollection(Of vbtest)Public database As IMongoDatabasePublic mlist As List(Of vbtest)Public builder As FilterDefinitionBuilder(Of vbtest) = New FilterDefinitionBuilder(Of vbtest)Public vm As vbmongoT(Of vbtest) = New vbmongoT(Of vbtest)("meandmycoach", "vbtest")PublicfilterAs FilterDefinition(Of vbtest)Private Async Sub Button1_Click(sender AsObject, e As EventArgs) Handles Button1.Clickbsdoc.content
= RichTextBox1.Textvm.filter
= vm.builder.Eq(Of ObjectId)("_id", New ObjectId(ComboBox1.Text))vm.up
= New UpdateDefinitionBuilder(Of vbtest)vm.updef
= vm.up.Set(OfString)("content", bsdoc.content)‘vm.up.Set(Of String)("content", bsdoc.content)vm.updef = vm.up.Combine(vm.updef)
vm.updateone(vm.filter, vm.updef)
End Sub
PrivateSub Form1_Load(sender AsObject, e As EventArgs) HandlesMyBase.Load
vm = New vbmongoT(Of vbtest)("meandmycoach", "vbtest")
Dim bsdoc As vbtest = New vbtest()
End Sub
Private Async Sub PictureBox1_Click(sender AsObject, e As EventArgs) Handles PictureBox1.Click
mlist = Await vm.loadrecords()
For i AsInteger = 0To mlist.Count - 1
ComboBox1.Items.Add(mlist(i)._id.ToString())
Next
ComboBox1.Text = ComboBox1.Items(0)
Label2.Text = mlist.Count.ToString()
End Sub
PrivateSub RichTextBox1_TextChanged(sender AsObject, e As EventArgs) Handles RichTextBox1.TextChanged
End Sub
Private Async Sub ComboBox1_TextChanged(sender AsObject, e As EventArgs) Handles ComboBox1.TextChanged
bsdoc = Await vm.loadone(ComboBox1.Text)
RichTextBox1.Text = bsdoc.content
End Sub
Private Async Sub ComboBox1_SelectedIndexChanged(sender AsObject, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
End Sub
End Class
功能描述:通过点击图片,加载所有的vbtest文档记录,combobox1专门用于显示ObjectId,可以通过ToString()方法转换为普通字符串
随着下拉框ObjectId的改变,richtext1控件加载 vbtest实体类对应记录的Content字段,可以更改字段内容后 点击 更新提交 按钮完成文档的UpdateOneAsync操作
vs2019 下用 vb.net窗体程序连接 mongodb4.2
以上是 vs2019下用vb.net窗体程序连接mongodb4.2 [数据库教程] 的全部内容, 来源链接: utcz.com/z/535070.html