2017-06-15 102 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? –