2013-07-29 87 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函数很困难。任何有关的提示将不胜感激。 –