如何从 Excel 连接 Mongodb

2024-01-30

我想使用 excel 宏连接到 mongodb 数据库,有人知道如何完成这个任务吗?


外壳方法

几乎所有与命令行交互的内容都可以使用 Shell 进行访问。

下面是一个简单的示例,它连接到正在运行的 MongoDB 实例并将查询打印到即时窗口。您需要添加对Windows Script Host Object Model.

Private Sub Test()

    Dim wsh As New WshShell
    Dim proc As WshExec
    Dim line As String
    
    Set proc = wsh.Exec("mongo")
    
    With proc
        .StdIn.WriteLine "use test"
        .StdIn.WriteLine "db.restaurants.find({""address.zipcode"":""10075""})"
        .StdIn.WriteLine "quit()"
        
        Do While .Status = WshRunning
            line = .StdOut.ReadLine
            If line = "Type ""it"" for more" Then
                .StdIn.WriteLine "it"
            ElseIf line Like "{*" Then
                Debug.Print line
            End If
            DoEvents
        Loop
    End With
End Sub

然而,仅打印原始 JSON 字符串并不是很令人兴奋或有用。您可以编写自己的 JSON 解析器,但在本例中,我们将使用 Tim Hall 的 VBA-JSON(您可以在 GitHub 上找到它 https://github.com/VBA-tools/VBA-JSON).

在撰写本文时,使用 VBA-JSON 解析从 MongoDB 返回的字符串时必须解决一个问题。任何包含括号的值,例如"_id": ObjectId("..."),会抛出错误。对此的一个快速而肮脏的解决方法是使用 RegEx 来清理解析器的字符串。您将需要参考Microsoft VBScript Regular Expressions 5.5库用于以下功能的工作。

Private Function CleanString(str As String) As String

    Dim temp As String
    Dim rx As New RegExp
    
    With rx
        .IgnoreCase = True
        .Global = True
        
        .Pattern = "[a-z]*\(" ' Left
        temp = .Replace(str, "")
        .Pattern = "\)" ' Right
        temp = .Replace(temp, "")
    End With
    
    CleanString = temp
End Function

然后我们可以解析从 MongoDB 返回的 JSON 并将每个对象添加到Collection。访问值变得非常简单。

Private Sub Mongo()

    Dim wsh As New WshShell
    Dim proc As WshExec
    Dim line As String
    Dim response As New Collection
    Dim json As Object
    
    Set proc = wsh.Exec("mongo")
    
    With proc
        .StdIn.WriteLine "use test"
        .StdIn.WriteLine "db.restaurants.find({""address.zipcode"":""10075""})"
        .StdIn.WriteLine "quit()"
        
        Do While .Status = WshRunning
            line = .StdOut.ReadLine
            If line = "Type ""it"" for more" Then
                .StdIn.WriteLine "it"
            ElseIf line Like "{*" Then
                response.Add ParseJson(CleanString(line))
            End If
            DoEvents
        Loop
    End With
    
    For Each json In response
        Debug.Print json("name"), json("address")("street")
    Next
End Sub

...这将从 MongoDB 中产生以下输出示例数据集 https://docs.mongodb.org/getting-started/shell/import-data/.

Nectar Coffee Shop          Madison Avenue
Viand Cafe                  Madison Avenue
Don Filippo Restaurant      Lexington Avenue
Lusardi'S Restaurant        Second Avenue
Due                         Third Avenue
Lenox Hill Grill/Pizza      Lexington Avenue
Quatorze Bistro             East   79 Street
Luke'S Bar & Grill          Third Avenue
Starbucks Coffee            Lexington Avenue
New York Jr. League         East   80 Street
Doc Watsons                 2 Avenue
Serafina Fabulous Pizza     Madison Avenue
Canyon Road Grill           1 Avenue
Sushi Of Gari East          78 Street

Gotchas

  • ReadLine and WriteLine are 阻塞函数.
  • 打开的窗户是由Exec 无法隐藏.

上述两种情况的解决方法是使用两层方法,其中 VBA 使用以下命令调用隐藏脚本wsh.Run,然后运行Exec(以及与过程交互的任何其他代码)。这种方法的缺点是 StdIn(以及一定程度上的 StdOut)必须写入文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Excel 连接 Mongodb 的相关文章

随机推荐

  • Python - 自动检测电子邮件内容编码

    我正在编写一个脚本来处理电子邮件 并且我可以访问电子邮件的原始字符串内容 我目前正在寻找字符串 Content Transfer Encoding 并扫描紧随其后的字符 以确定编码 编码示例 base64 或 7bit 或引用打印 有没有更
  • 在 Play Framework 2.0 上运行演化

    最近的这篇文章 如何在 Play Framework 2 0 中使用 Evolutions https stackoverflow com questions 8164157 how to use evolutions in play fr
  • 从我的网页访问 Flask 服务器

    这是一个问题 从这个问题继续here https stackoverflow com questions 22088719 can flask use with jquery post 我正在尝试使用网页上的图像按钮来控制伺服电机 我的伺服
  • 使用完整单词作为登录系统的变量[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在创建一个登录系统 当前使用硬编码整数作为用户 ID 密码和学生号 这意味着它们都是数字 我将使用什么来使整数 用户 ID 和密码 成为
  • PSQLException:当前事务被中止,命令被忽略直到事务块结束

    我在 JBoss 7 1 1 Final 的 server log 文件中看到以下 截断的 堆栈跟踪 Caused by org postgresql util PSQLException ERROR current transaction
  • 如何从其他节点js文件调用该函数

    这些代码存储在单独的文件中 我尝试从该文件调用 get 方法到另一个nodejs 但我只得到 Function 作为输出 谁能告诉我如何从这个文件调用另一个节点js文件的get方法 use strict var createAPIReque
  • 如何清除 MySQL 控制台中的屏幕? [复制]

    这个问题在这里已经有答案了 我无法清除 MySQL 命令行提示符中的屏幕 我的屏幕上充满了表格 数据和查询 我怎样才能清除它 Ctrl L 会做的 这是一个 shell 命令 但它在 MySQL 控制台中运行良好
  • 带 DatePicker 的 AlertDialog

    我的想法是使用 AlertDialog 并将其设置为 DatePicker 我的代码是 AlertDialog Builder builder new AlertDialog Builder this DatePicker picker n
  • PLCrashReporter - 如何符号化进程中的崩溃数据?

    在我们获得崩溃数据后 有没有办法对崩溃报告进行符号化 目前 这就是我在handleCrashReport方法中所做的事情 PLCrashReportTextFormat textFormat PLCrashReportTextFormati
  • Android 在 Google 地图中进行捏合缩放

    谷歌地图中的捏缩放功能是否可行 我进行了多次搜索但没有得到任何解决方案 请给出您的看法 或者需要编写api来实现这些功能 您是否使用 ScaleGestureDetector 来实现捏合和缩放 http developer android
  • 我的 Android 设备上的多个编码器支持 Mime 类型视频/avc

    当我枚举设备上的所有媒体编解码器时 我注意到以下编码器支持 mime 类型 video avc OMX qcom video encoder avc OMX google h264 encoder 你打电话时MediaCodec Creat
  • 如何高效找到重叠区间?

    我有以下玩具示例数据框 df f low f high 0 476201 0 481915 0 479161 0 484977 0 485997 0 491911 0 503259 0 508679 0 504687 0 510075 0
  • 尝试在 C# 中的 UInt16 上执行按位非 (~) 时出错

    出于某种原因 我根本不理解 或不明白 为什么这是有效的 UInt32 a 0x000000FF a UInt32 0x00000001 但这并没有 UInt16 a 0x00FF a UInt16 0x0001 它给出错误 常量值 某些数字
  • 如何处理 上的点击而不是子元素上的点击?

    我用以下代码处理点击 带输入的表 table tr td td tr table
  • sass 会损害性能吗?

    我一直在教育自己 阅读this http code google com speed page speed docs rendering html 引擎从右到左评估每个规则 从最右边的选择器 称为 键 开始并遍历每个选择器 直到找到匹配或丢
  • 如何为 Windows Phone 8 应用程序创建图表/图形? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在Windows Phone 8 应用程序 图表 图表 http img837 imageshack
  • 使您的 .NET 语言在调试器中正确运行

    首先 我对这个问题的长度表示歉意 我是作者钢铁计划 http ironscheme codeplex com 最近 我一直在努力发出合适的调试信息 以便我可以使用 本机 NET 调试器 虽然这取得了部分成功 但我遇到了一些初期问题 第一个问
  • AJAX HTML PHP 问题

    这是我的scripts js function showHint str if str length 0 document getElementById txtHint innerHTML return if window XMLHttpR
  • Haskell 中的链接/组合类型类

    假设我有两个定义如下的类型类 它们的功能相同但名称不同 class Monad m where gt gt m a gt a gt m b gt m b return a gt m a class PhantomMonad p where
  • 如何从 Excel 连接 Mongodb

    我想使用 excel 宏连接到 mongodb 数据库 有人知道如何完成这个任务吗 外壳方法 几乎所有与命令行交互的内容都可以使用 Shell 进行访问 下面是一个简单的示例 它连接到正在运行的 MongoDB 实例并将查询打印到即时窗口