【问题标题】:MongoDB - How to consume printjson output in JavaMongoDB - 如何在 Java 中使用 printjson 输出
【发布时间】:2011-04-22 02:44:14
【问题描述】:

我需要通过 Java 与 MongoDB shell 通信
简而言之,我使用像 Runtime.exec (特别是公共执行)之类的东西来调用MongoDB shell in --eval mode

使用这种方法,我能够成功调用 MongoDB 命令,将输出检索到流中(例如打印到标准输出)

到目前为止一切都很好。

我现在需要将此输出“解析”成类似JSONObject 的数组
(我可以使用任何可能适合此的 JSON 库,例如 Jackson 等) 这样我就可以根据一些要求“按摩”输出。 (改变格式,去掉一些键值对等)

当我至少在数组的情况下查看 printjson 生成的输出时,它似乎不是一个有效的 json 数组,而是由新行分隔的有效 json 对象,中间没有逗号或包含 []它是一个有效的数组。

在这种情况下,关于如何将此输出解析为某种持有者对象,我可以使用这些对象来读取/修改键值对,有什么建议吗?

我在编译时没有 json 命令,但我知道这些命令总是以 printjson 结尾

编辑 -

所以为了简化,例如,我正在寻找一种将以下输出解析为 Java 对象的方法 -
(各个键/值对在编译时是未知的)


{
    "_id" : ObjectId("4db0e0289523f82ff6cd90d4"),
    "calendar_date" : "2009-11-10",
    "product_id" : 8,
    "channel" : "website",
    "country" : "USA",
    "total_unit_count" : 740,
    "total_amount" : 11367.29
}
{
    "_id" : ObjectId("4db0e0289523f82ff6cd90d5"),
    "calendar_date" : "2009-11-10",
    "product_id" : 8,
    "channel" : "website",
    "country" : "Australia",
    "total_unit_count" : 740,
    "total_amount" : 13893.09
}
{
    "_id" : ObjectId("4db0e0289523f82ff6cd90d6"),
    "calendar_date" : "2009-11-10",
    "product_id" : 8,
    "channel" : "retail",
    "country" : "USA",
    "total_unit_count" : 13,
    "total_amount" : 8296.89
}

【问题讨论】:

  • 您将使用 Java JSON 解析器,其中有很多在您链接的站点之一上列出; json.org
  • 您是否有不想使用 MongoDB Java 驱动程序的原因?在这种情况下,持有者对象将是 DBObject,您的代码将比解析 eval 的 JSON 输出更清晰。
  • 驱动程序中有一个 API,可以让您向服务器发送命令(或多或少像您在控制台上所做的那样)。 MongoDB 的 javadoc 站点已损坏,因此我无法查找,但请尽快回复。
  • 太糟糕了,javadoc 站点仍然关闭(由于今天早些时候 AWS 中断):(
  • 对不起,因为放假,我起晚了 :) 这里是我说的函数api.mongodb.org/java/2.5.3/com/mongodb/DB.html#eval

标签: java json mongodb jackson


【解决方案1】:

您可以直接在 java 中运行任何可以用 javascript 编写的东西(使用 mongodb java 驱动程序)。

把java的输出消耗掉是个坏主意。相反,您应该使用驱动程序直接从 java 运行命令/查询。

【讨论】:

  • 我有一个遗留系统可以“产生”对 mongo shell 的查询。你是说我可以接受这些 shell 理解的纯文本查询并将它们按原样传递给 mongo java 驱动程序吗?什么方法?上次我检查时,mongo java 驱动程序中没有任何内容允许这样做。
  • 您可以使用 JSON.parse(...) 将 json 字符串转换为可以用作查询限制的 DBObject。这允许您获取这样的字符串:{field:"value"} 并使用它运行查询。
  • 感谢您进一步考虑这个问题,但查询不是 json,它们是 javascript,最初是为了在 mongo shell 上运行。
【解决方案2】:

com.mongodb.util.JSON 似乎没有扩展 DBObject,我不确定为什么人们声称您可以执行 collection.insert(JSON.parse(some json))。还有其他方法可以插入我缺少的 json 吗?

编辑:这里的答案很简单,但不在文档中。只需添加演员表:

collection.insert((DBObject)JSON.parse(some json ... ));

【讨论】:

    【解决方案3】:

    我正在寻找的东西目前似乎不可能。

    我最终做的是屏蔽 mongo 调用,在 java 中获取结果流,将结果 JSON 化(去掉 object_id,因为我不需要它,适当地转换日期等),然后生成一个 json 对象从此修改后的结果字符串。 丑陋的黑客,但似乎唯一可行的方法。

    如果您遇到类似情况并有具体问题,请在下面的评论中发帖,如果可以,我会提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多