vs2019 下用 vb.net编写窗体程序连接 mongodb4.2的方法

说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始。幸亏有很多天才,成功破译,我才得以沿着他们走的路,照猫画虎的走下去。整个项目结构如下:

类文件中vbtest.vb数据库实体类对应着mongodb文档vbtest,用于数据操作测试

Imports MongoDB.Bson

Public Class vbtest
 Public _id As ObjectId
 Public content As String
End Class

(optional)vbmongo.vb是绑定好数据库实体类vbtest的版本

Imports MongoDB.Bson
Imports MongoDB.Driver

Public Class vbmongo
 Public client
 Public collection As IMongoCollection(Of vbtest)
 Public database As IMongoDatabase
 Public mlist As List(Of vbtest)
 Public builder As FilterDefinitionBuilder(Of vbtest) = New FilterDefinitionBuilder(Of vbtest)
 Public filter As FilterDefinition(Of vbtest)
 Public Sub New(ByVal dbname As String, ByVal collectionname As String)
  client = New MongoClient("mongodb://127.0.0.1:27017")
  database = client.GetDatabase(dbname)
  collection = database.GetCollection(Of vbtest)(collectionname)
 End Sub

 Public 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 As String) 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 As String, 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(Of String)("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

Public Class vbmongoT(Of T)
 Public client
 Public collection As IMongoCollection(Of T)
 Public database As IMongoDatabase
 Public 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)
 Public filter As FilterDefinition(Of T)
 Public Sub New(ByVal dbname As String, ByVal collectionname As String)
  client = New MongoClient("mongodb://127.0.0.1:27017")
  database = client.GetDatabase(dbname)
  collection = database.GetCollection(Of T)(collectionname)
 End Sub

 Public 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 As String) 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(ByVal filter As 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.Bson
Imports MongoDB.Driver

Public Class Form1
 Public client
 Public bsdoc As vbtest
 Public collection As IMongoCollection(Of vbtest)
 Public database As IMongoDatabase
 Public 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")
 Public filter As FilterDefinition(Of vbtest)
 Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  bsdoc.content = RichTextBox1.Text
  vm.filter = vm.builder.Eq(Of ObjectId)("_id", New ObjectId(ComboBox1.Text))
  vm.up = New UpdateDefinitionBuilder(Of vbtest)
  vm.updef = vm.up.Set(Of String)("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

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  vm = New vbmongoT(Of vbtest)("meandmycoach", "vbtest")
  Dim bsdoc As vbtest = New vbtest()
 End Sub

 Private Async Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
  mlist = Await vm.loadrecords()
  For i As Integer = 0 To mlist.Count - 1
   ComboBox1.Items.Add(mlist(i)._id.ToString())
  Next
  ComboBox1.Text = ComboBox1.Items(0)
  Label2.Text = mlist.Count.ToString()
 End Sub

 Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged

 End Sub

 Private Async Sub ComboBox1_TextChanged(sender As Object, e As EventArgs) Handles ComboBox1.TextChanged
  bsdoc = Await vm.loadone(ComboBox1.Text)
  RichTextBox1.Text = bsdoc.content
 End Sub

 Private Async Sub ComboBox1_SelectedIndexChanged(sender As Object, 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连接 mongodb4.2内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vs2019 下用 vb.net编写窗体程序连接 mongodb4.2的方法

    说起来,查看Mongodb官方的接口文档是场噩梦,尽管mongodb官方花了大力气整顿了它的API,但是简单的接口罗列,0代码示范,让人无从开始.幸亏有很多天才,成功破译,我才得以沿着他们走的路,照猫画虎的走下去.整个项目结构如下: 类文件中vbtest.vb数据库实体类对应着mongodb文档vbtest,用于数据操作测试 Imports MongoDB.Bson Public Class vbtest Public _id As ObjectId Public content As Stri

  • Python实现Linux下守护进程的编写方法

    本文实例讲述了Python实现Linux下守护进程的编写方法,分享给大家供大家参考,相信对于大家的Python程序设计会起到一定的帮助作用.具体方法如下: 1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的命令行或shell程序.需要这一步以便保证新进程不是一个进程组头领进程(process group leader).下一步,'setsid()',会因为你是进程组头领进程而失败.进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同.子进程从父进程继

  • VSCode下.json文件的编写之(1) linux/g++ (2).json中参数与预定义变量的意义解释

    0 引言 转入linux/VSCode编程之后,迫切了解到有必有较为系统地学习一下VSCode中相关配置文件的写法.下面将分为 linux/g++编译指令..json文件关键词/替换变量的意义.编译链接过程原理分析几个部分进行介绍,并以opencv为例,将上述知识综合运用. 1 linux/g++编译指令介绍 参照BattleScars的博客,摘取其中对本文有用的部分进行运用,博客链接如下,质量非常之高,表示感谢!!! https://www.jb51.net/article/183540.ht

  • Window版下在Jupyter中编写TensorFlow的环境搭建

    在疫情飘摇的2020年初,TensorFlow发布了2.1.0版本,本Python小白在安装过程中遇坑无数,幸得多年练就的百度功力终于解决,特记录下来以免后人跳坑. 准备工作 Python 3.6或3.7 .TensorFlow2.1.0版本将是最后一个支持Python 2的版本,但Python3.8还不支持,因此请自行从官网下载安装Python 3.6或3.7(我安装的是3.6). 一.搭建虚拟环境(以下顺序不要乱) virtualenv可以搭建虚拟且独立的Python环境,解决不同的工程依赖

  • VS2019中scanf返回值被忽略的问题及其解决方法

    昨天在使用Visual Studio 2019编写C语言程序时遇到了scanf返回值被忽略问题 因为我也是刚开始学习C语言,第一次遇到这种问题,也不知道怎么回事,然后就上Chrome研究了一番,才知道原因,并且找到了几种分散在个个角落的解决方法,我在这里归纳总结一下. 问题原因: 在ANSI C中只有scanf(),没有scanf_s(),但是scanf()在读取时不检查边界,所以可能会造成内存泄漏.于是Microsoft公司在VS编译器中提供了scanf_s(),如果想继续使用scanf这个不

  • Apache下通过shell脚本提交网站404死链的方法

    网站运营人员对于死链这个概念一定不陌生,网站的一些数据删除或页面改版等都容易制造死链,影响用户体验不说,过多的死链还会影响到网站的整体权重或排名. 百度站长平台提供的死链提交工具,可将网站存在的死链(协议死链.404页面)进行提交,可快速删除死链,帮助网站SEO优化.在提交死链的文件中逐个手动填写死链的话太麻烦,工作中我们提倡复杂自动化,所以本文我们一起交流分享Apache服务中通过shell脚本整理网站死链,便于我们提交. . 1.配置Apache记录搜索引擎 Apache是目前网站建设最为主

  • 同一个文件在windows和linux下计算md5哈希不一致的原因及解决方法

    最近项目需要,需要对客户传过来的文件进行MD5校验,在实现的过程中前前后后遇到了若干问题,在这里总结一下. md5的计算采用openssl实现,具体代码网上很多,这里不再赘述.需要注意的问题 1 读取文件内容时,文件打开方式要用二进制方式(rb),因为用户文件有可能是linux格式,如果用文本方式打开,可能会改变原始的内容,造成计算不准. 2 结果检验.windows可以随便下载一个md5计算工具,网上很多,我用的是HashMyFiles.linux下面,md5sum 文件名 即可. 还有一个隐

  • 使用python编写udp协议的ping程序方法

    服务器端 import random from socket import * serverSocket = socket(AF_INET, SOCK_DGRAM)#建立udp协议的socket连接 serverSocket.bind(('', 12000)) while True: rand = random.randint(0, 10)#生成随机数,模拟udp环境下的丢包 message, address = serverSocket.recvfrom(1024)#接收客户端发送的信息,应该

  • 使用.Net Core编写命令行工具(CLI)的方法

    命令行工具(CLI) 命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. 通常认为,命令行工具(CLI)没有图形用户界面(GUI)那么方便用户操作.因为,命令行工具的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行工具要较图形用户界面节约计算机系统的资源.在熟记命令的前提下,使用命令行工具往往要较使用图形用户界面的操作速度要快.所以,图形用户界面的操作系统中,都保留着可选的命令行工具. 另外

  • Linux下Tomcat启动正常,但浏览器无法访问的解决方法

    1.服务器可ping通 2.服务器抓本地的http请求包,可以抓到 3.本地抓服务器返回的http响应包,抓不到 经过查找,是由于开启了Linux防火墙 查看防火墙配置(需要root权限) [root@localhost ~]# service iptables status Redirecting to /bin/systemctl status  iptables.service iptables.service - IPv4 firewall with iptables Loaded: l

随机推荐