在MongoDB中运行记录中的值
不幸的是,我被派去处理MongoDB中最不重要的记录,但我没有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
{
"_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"}
]);