【问题标题】:mongodb printjson will output ObjectId to result, which can not be used for JSON.parsemongodb printjson 会输出 ObjectId 到 result,不能用于 JSON.parse
【发布时间】:2014-10-20 06:24:03
【问题描述】:

我像这样运行我的 mongo shell 脚本:

mongo --quiet myscript.js > /tmp/my.json

我在 myscript.js 中使用 printjson。 mongodb printjson 会输出 ObjectId 到my.json,像这样:

"_id" : ObjectId("5444a932ca62bbcba14a1082")

我从 mongo shell 中读取了一些源代码。 printjson 将为 ObjectId 对象运行此代码。

> x._id.tojson
function (){
    return this.toString();
}

在 mongo 2.2 版本之后,ObjectId("507c7f79bcf86cd7994f6c0e").toString() 将返回以下字符串:

ObjectId("507c7f79bcf86cd7994f6c0e")

这不是我想要的。我用ObjectId("507c7f79bcf86cd7994f6c0e").valueOf()

这将返回以下字符串:

507c7f79bcf86cd7994f6c0e

最后,我在myscript.js中添加一行:

ObjectId.prototype.toString = function() { return '"' + this.valueOf() + '"'; }

我解决了我的问题。但我不喜欢更改toString() 的原始行为。 有没有更好的解决方案?

【问题讨论】:

    标签: json mongodb tostring mongo-shell


    【解决方案1】:

    根据您的脚本中的内容,您可以使用mongoexport 而不是mongo 来解决您的问题。 mongoexport JSON 输出使用 extended json 的“严格模式”,这是有效的 JSON,可以被其他非 mongo JSON 工具解析。

    要使用此技术,您需要将查询从“shell 模式”转换为“严格模式”,将数据库名称和集合名称作为参数传递,并为您的 shell 正确引用。例如,使用为 mongo shell 编写的这个查询:

    db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}})
    

    并使用 mongoexport 将其转换为等效的 shell 表达式:

    mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}'
    

    此输出可以通过管道传输到 json_ppjq 或其他需要有效 JSON 作为输入的工具。

    【讨论】:

      【解决方案2】:

      同意,像这样修改框架功能是一个危险的想法。这也改变了所有其他代码的ObjectID.toString 行为,而不仅仅是printjson

      由于 MongoDB 聚合框架不允许使用任意 JavaScript,我们不能只做 db.test.aggregate({$project: {_id: '$_id.valueOf()'}}) 之类的事情,或者给它一个自定义的转换函数来使用。

      MongoDB map-reduce 框架可以使用自定义的 JavaScript 函数,也许可以实现这一点,但它相当复杂、速度慢,而且似乎普遍不鼓励使用。

      您最好的选择是以某种形式将此 ID 转换作为脚本的一部分。要么根据需要在打印之前转换文档:

      var cursor = db.test.find();
      while (cursor.hasNext()) {
          var doc = cursor.next();
          doc._id = doc._id.valueOf();
          printjson(doc);
      }
      

      或者变得更复杂,并将其包装在您自己的打印函数中,或者替换或装饰原始的printjson 函数,例如修改文档仅用于打印并回滚更改:

      var theirPrintjson = printjson;
      var printjson = function(doc) {
          var id = doc._id;
          doc._id = doc._id.valueOf();
          theirPrintjson(doc);
          doc._id = id;
      };
      

      【讨论】:

      • 如果我嵌入了文档,您的方法是否合适?
      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多