【问题标题】:Scripting MongoDB shell, return ID in clean format编写 MongoDB shell 脚本,以干净的格式返回 ID
【发布时间】:2023-03-09 16:50:01
【问题描述】:

下面的脚本应该从 mongo 返回我想要的值的 CSV,返回我想要的所有数据,但是两个项目的格式不同,并且尝试我可能无法仅获取值。
问题 1: 第一个返回的项目“$_id”,返回 ObjectId("5a4b7775d9cc09000185b908") 但我只想获取值 5a4b7775d9cc09000185b908。每次我尝试解析它或使用 valueOf 时,它都会返回一个空白值。

问题 2: 我要求的第四项应该是使用两个日期值 {$subtract: [ "$finished", "$started" 的时间格式] }(开始和结束时间)。我得到的是 NumberLong(5844) 这应该只是 milisenconds。

脚本

var cur=db.submissions.aggregate(
[
    {$match: { started: {'$gte': ISODate('2018-01-02 01:01:01.001'), '$lte': ISODate('2018-01-02 13:15:59.999' ) } } },
    {$project: { 
        data: [
    "$_id",
    {$dateToString: { format: "%Y-%m-%d %H:%M:%S", date: "$started" } },
    {$dateToString: { format: "%Y-%m-%d %H:%M:%S", date: "$finished" } },
    {$subtract: [ "$finished", "$started" ] },
    "$inputs.x12InputFile.size"
           ] 
        }
    }
]
)
cur.forEach(function(doc) {print(doc.data)})

当前结果

ObjectId("5a4b7775d9cc09000185b908"),2018-01-02 12:13:42,2018-01-02 12:13:48,NumberLong(5844),5322
ObjectId("5a4b77d530391100017d92df"),2018-01-02 12:15:18,2018-01-02 12:15:26,NumberLong(8593),5178

预期结果

5a4b7775d9cc09000185b908,2018-01-02 12:13:42,2018-01-02 12:13:48,5844,5322
5a4b77d530391100017d92df,2018-01-02 12:15:18,2018-01-02 12:15:26,8593,5178

任何帮助将不胜感激。我是编写 mongo 查询脚本的新手,所以如果可能的话,响应中的详细信息/示例会有所帮助。

【问题讨论】:

标签: javascript json mongodb


【解决方案1】:

我不会使用聚合框架来格式化结果。无论如何,您无法在聚合管道中将 ObjectId 转换为字符串。

var cursor = db.submissions.find({started:{'$gte': ISODate('2018-01-02 
01:01:01.001'),'$lte': ISODate('2018-01-02 13:15:59.999' )}},{started : 1, 
finished : 1, "inputs.inputFile.size" : 1});

cursor.forEach( function(doc) { 
    var arr=[];
    arr.push(doc._id.str);
    arr.push(doc.started.toISOString());
    arr.push(doc.finished.toISOString());
    arr.push(doc.finished.getTime() - doc.started.getTime());
    print(arr)
});

【讨论】:

  • 这太棒了,几乎正是我想要的,但是这没有推送 "inputs.inputFile.size" 的选项。我已经尝试了几个选项来打印它,但是我要么错过了打印它的正确方法,要么我以不正确的方式调用。你知道这里的简单答案吗?
  • 对我不起作用。感谢您对此进行调查。将回来查看更新的答案
  • 已使用 JSON 更新...如您所见,我需要从 mongo 中获取 inputs.inputFile.size 的值并使用数组打印出来。
  • 类似arr.push(doc.inputs.inputFile.size);
  • 当我告诉你这个时,你不会相信我,但我尝试了一百种不同的方法,但都失败了。这次奏效了。我回头一看,胖手指了一个值……非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2011-03-08
  • 2016-04-24
相关资源
最近更新 更多