在MongoDB中运行记录中的值

在MongoDB中运行记录中的值,mongodb,Mongodb,不幸的是,我被派去处理MongoDB中最不重要的记录,但我没有MongoDB技能 我有以下格式的记录: { "_id" : ObjectId("Some ID"), "reason" : "Parameter: (artifact_id) is mandatory", "timestamp_utc" : ISODate("2019-09-20T14:30:41.943Z"), "timestamp" : ISODate("2019-09-20T07:30:41.9

不幸的是,我被派去处理MongoDB中最不重要的记录,但我没有MongoDB技能

我有以下格式的记录:

{
    "_id" : ObjectId("Some ID"),
    "reason" : "Parameter: (artifact_id) is mandatory",
    "timestamp_utc" : ISODate("2019-09-20T14:30:41.943Z"),
    "timestamp" : ISODate("2019-09-20T07:30:41.943Z"),
    "eventType" : "Some_Event",
    "clientID" : "24839961",
    "time_bucket" : [
        "2019-year",
        "2019-09-month",
        "2019-37-week",
        "2019-09-20-day",
        "2019-09-20 07-hour"
    ],
    "payload" : {
        "resWidth" : 1440,
        "resHeight" : 900,
        "device" : "",
        "context_eid" : "Some EID",
        "artifact_revision_id" : 8389171,
        "page_url" : "Some URL",
        "client_ip" : "Some IP",
        "tz" : "Asia/Calcutta",
        "memberID" : Some_ID,
        "url_referrer" : "Some_URL",
        "tabID" : "Some ID",
        "artifactID" : 5665946,
        "visitorID" : "Some ID",
        "g_event_id" : "Some ID",
        "content_data" : "Some Data",
        "sessionID" : "Some ID",
        "user_agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
    },
    "resolved" : false
}
注意,负载是它自己的字典。我必须取消对该词典的测试,并将其恢复到与文档中其他键相同的级别。像这样:

{
    "_id" : ObjectId("Some ID"),
    "reason" : "Parameter: (artifact_id) is mandatory",
    "timestamp_utc" : ISODate("2019-09-20T14:30:41.943Z"),
    "timestamp" : ISODate("2019-09-20T07:30:41.943Z"),
    "eventType" : "Some_Event",
    "clientID" : "24839961",
    "time_bucket" : [
        "2019-year",
        "2019-09-month",
        "2019-37-week",
        "2019-09-20-day",
        "2019-09-20 07-hour"
    ],
    "resWidth" : 1440,
    "resHeight" : 900,
    "device" : "",
    "context_eid" : "Some EID",
    "artifact_revision_id" : 8389171,
    "page_url" : "Some URL",
    "client_ip" : "Some IP",
    "tz" : "Asia/Calcutta",
    "memberID" : Some_ID,
    "url_referrer" : "Some_URL",
    "tabID" : "Some ID",
    "artifactID" : 5665946,
    "visitorID" : "Some ID",
    "g_event_id" : "Some ID",
    "content_data" : "Some Data",
    "sessionID" : "Some ID",
    "user_agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
    "resolved" : false
}
我的初步研究表明,减少美元可能是一种选择,但我似乎无法理解

在此问题上的任何帮助都将不胜感激。如果这个任务太简单而无法发布,我很抱歉,但我没有MongoDB技能。

您可以使用。如果我们将顶级文档$$ROOT变量与payload对象合并,我们会得到一个对象$mergeObjects应该被分配到新变量中,但是我们减少了管道步骤,使用$ReplaceRoot或$ReplaceWith在其中执行2个操作


如果您使用的是小于4.2的Mongo版本,则无法使用其自身的值更新文档,这意味着您必须读取文档,然后重新保存。 数据重组可以在Mongo或代码中进行

下面是一个使用js的快速示例:

db.EVENT_NAME.find().map(function(u) {
    let newDoc = Object.assign(u, u.payload);
    delete newDoc.payload;
    return db.EVENT_NAME.findOneAndReplace({_id: newDoc._id}, {$set: newDoc})
} );
但是,Mongo 4.2中引入了以下命令,这意味着您现在可以在一个命令中完成所有这一切:

db.EVENT_NAME.updateMany({},
    [
        {
            $replaceRoot: {
                newRoot:
                    {$mergeObjects: ["$payload", "$$ROOT"]}
            }
        },
        {$unset: "payload"}
    ]);

请注意,您有timestamp_utc和timestamp字段,但是ISO格式的日期/时间字符串末尾的Z表示utc时间。我假设时间戳应该是本地时间,但值的时区是错误的。@WernfriedDomscheit非常感谢您指出这一点。我将对此进行研究。库可以帮助您生成和操作日期/时间值。MongoDB中的日期值始终存储在UTC中。通常,客户端会将它们转换为本地时间,并对其进行格式化。在shell中,您可以使用例如{$addFields:{timestamp_local:{$dateToString:{date:$timestamp_utc,格式:%d.%m.%Y%H:%m:%S,时区:$tz}
db.EVENT_NAME.updateMany({},
    [
        {
            $replaceRoot: {
                newRoot:
                    {$mergeObjects: ["$payload", "$$ROOT"]}
            }
        },
        {$unset: "payload"}
    ]);