2013-07-29 124 views
4

我存儲在MongoDB的物體看起來像:拼合嵌套JSON結構MongoDB中

{ 
_id: 123 
name: "xyz" 
    attrib: 
    { 
     address: "123 xyz rd", 
     phone: "123-456-7890" 
    } 
} 

我想削平這種結構,所以不存在attrib場,我只是有addressphone場以及name_id

到目前爲止,這是我已經試過:

db.emp.aggregate(
    { 
    $project : { 
      { addr : '$review.attrib.address' }, 
      { phn : '$review.votes.phone' }, 
     } 
    } 
); 

誰能幫我?

+0

爲什麼不把它壓扁在客戶端上?沒有實用的方法可以在各種大小的集合中高效地壓縮MongoDB中的字段。 – WiredPrairie

+0

扁平化客戶端是什麼意思?我怎樣才能做到這一點? –

+0

使用您計劃使用的任何編程語言,並執行您自己的客戶端數據投影。 – WiredPrairie

回答

1

如果您打算改變所有的文件在數據庫中,那麼無論是聚合框架或的Map/Reduce他們要走嗎?您可以用自己喜歡的語言編寫腳本,並循環播放集合中的所有文檔,以逐個修改它們。

6

我試了一下:

db.abc.insert({ 
    _id: 123, 
    name: "xyz", 
    attrib: { 
    address: "123 xyz rd", 
    phone: "123-456-7890" 
    } 
}); 
db.abc.aggregate(
{ 
    $project : { 
    _id:1, 
    name:1, 
    addr : '$attrib.address', 
    phn : '$attrib.phone' 
    } 
} 
); 

更多細節,你可以看到:use $project to rename fieldshttp://docs.mongodb.org/manual/reference/aggregation/project/

+0

我收到了:「errmsg」:「異常:聚合結果超過最大文檔大小 (16MB)」 –

+0

聚合框架當前返回結果作爲單個文檔作爲結果,結果僅限於16MB文檔大小限制。下一個版本應該包括將結果輸入集合的能力,從而消除這種限制。與此同時,如果遇到16MB的限制,編寫MapReduce過程是一條路。如果您碰巧需要一次檢索幾個文檔,則應該使用$ match操作符來啓動管道,並且/或者使用$ limit限制在16MB的範圍內工作。 –

+0

我在MongoVUE上編寫map/reduce函數很困難。任何有關的提示將不勝感激。 –