2017-06-15 103 views
0

这是一个后续行动平展嵌套的MongoDB文档

Flatten a nested object in MongoDB and rename

使用上所提到的答案后,一些数据类型得到接受和他们而一些投误差变平

can't convert undefined to object 

例如: - 的文件在其上的数据出现故障: -

{ 
    "id" : "1415304490", 
    "color" : { 
     "1391" : "Grey" 
    }, 
    "name":"Random Name" 
} 

,我使用的corrosponding功能: -

db.suggestion.find().forEach(function(doc) { 
    var color; 
    Object.keys(doc.color).forEach(function(key) { 
    color = doc.color[key]; 
    }); 

    db.suggestion.update(
     { _id: doc._id }, 
     { $set: 
      { color: color } 
     } 
    ); 
}) 

它跑20,000之前的文件,但现在没有这个文件上。

另外,如果我尝试通过在一个单一的ID运行它运行相同的代码,即

 db.suggest.find({id:"12"}) 

它再次工作正常,因为它应该是它早前失败相同的文档。

我也试图创建一个解决,因为它是运行发现每一个文件,即

db.suggestion.find().forEach(function(dest) { 
    var id_temp=dest.id; 

    db.suggestion.find({id:id_temp}).forEach(function(doc) { 
    var color; 
    Object.keys(doc.color).forEach(function(key) { 
     color = doc.color[key]; 
    }); 

    db.suggestion.update(
     { _id: doc._id }, 
     { $set: 
      { color: color } 
     } 
    ); 
    }) 
}) 

它仍然失败。我很不确定代码的这种奇怪的行为。

回答

1

使用$exists确保color密钥实际存在。这就是你遇到错误的原因。

var ops = []; 

db.collection.find({ "color": { "$exists": true } }).forEach(function(doc) { 
    var color; 
    Object.keys(doc.color).forEach(function(key) { 
    color = doc.color[key]; 
    }); 
    ops.push(
    { "updateOne": { 
     "filter": { "_id": doc._id }, 
     "update": { "$set": { "color": color } } 
    }} 
); 
    if (ops.length >= 500) { 
    db.collection.bulkWrite(ops); 
    ops = []; 
    } 
}) 

if (ops.length > 0) { 
    db.collection.bulkWrite(ops); 
    ops = []; 
} 

建立一个文件:

db.collection.insert(
{ 
    "id" : "1415304490", 
    "color" : { 
     "1391" : "Grey" 
    }, 
    "name":"Random Name" 
} 
) 

运行上和所提供的代码得到:

db.collection.find().pretty() 
{ 
     "_id" : ObjectId("59430fc4fc23376431161e52"), 
     "id" : "1415304490", 
     "color" : "Grey", 
     "name" : "Random Name" 
} 
+0

我同意,但是为什么要把代码失败测试文档中我因为它有一个颜色字段 –

+0

@AyushAggarwal它不会失败。我只是复制了你的文档,然后“再次”运行它。同样的结果,它完美地转换它。我的代码,而不是**你的**代码。我看到的问题是,您不是简单地应用您提供的代码。我认为不这样做的唯一原因是,实际上你的文件没有你所说的结构。但是在问题中提出的结构中,它工作得很好,并且当然会跳过任何没有颜色键转换的地方。这是你的问题中的错误,这就是解决的问题。 –

+0

我正在对您的代码进行编辑,因为在robomongo中运行脚本时,它在ops = [... ops]中显示为“未知”中的错误。 。因此,我必须将其更改为解决方法,并使其更新为一个,而不是像您所做的那样批量更新。休息一下,我认为robomongo存在一个问题,我现在在shell中运行它。你建议的任何其他MongoDB GUI? –