Mongodb使用数组聚合并将多个文档转换为单个文档

时间:2014-07-02 15:10:16

标签: mongodb aggregation-framework

我有970,000,000个相同结构的文档,在集合pdb_atoms示例中:

{
    "_id" : ObjectId("53b070793a39c4ee55fb3a90"),
    "pdb_id" : "pdb263d",
    "serial" : 20,
    "name" : "O5*",
    "res" : "DG",
    "res_seq" : 2,
    "chain_id" : "A",
    "x" : 22.819,
    "y" : 30.64,
    "z" : 85.707
}

我想创建一个新的集合pdb,其中填充了pdb文档,其中包含pdb_id属性和一个Array(atoms),它们为同一个pdb_id保存了上述类型的许多记录。

我已经编写了下面的脚本,但它似乎不起作用: -

// Aggregate all pdb_atom documents for a given pdb_id into one single document
// containing an array of atoms for that given pdb_id
db.pdb_atoms.distinct("pdb_id").forEach( function(pdb_id)
{       
  printjson(pdb_id);
  var arr_pdb_atoms = db.pdb_atoms.find( pdb_id ).toArray();
  // Aggregate the pdb_atoms into one pdb document with an array of pdb_atoms
  var pdb_json = {
                "pdb_id" : pdb_id,
                "atoms" : arr_pdb_atoms
                }; 
  // Save new pdb document to pdb collection
  db.pdb.save(pdb_json);
}
);

错误讯息: " pdb263d" 7月2日星期三16:03:02.252 JavaScript执行失败:错误:{     " $ ERR" :" JavaScript执行失败:ReferenceError:pdb263d未定义",     "代码" :16722 在src / mongo / shell / query.js:L128

第一项" pdb263d"来自查询结果。

使用游标迭代整个pdb_atom集合并仅在遇到不同的pdb_id时插入会更有效。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:1)

可以使用下面的单个aggregate查询来完成此操作。如果您使用的是MongoDB 2.6,则可以利用$out运算符将输出定向到集合。

db.pdb_atoms.aggregate([
    {
        $group : {
            _id : "$pdb_id", 
            atoms : {
                $push : {
                    _id:"$_id", 
                    pdb_id:"$pdb_id", 
                    serial:"$serial", 
                    name:"$name", 
                    res:"$res", 
                    res_seq:"$res_seq", 
                    chain_id:"$chain_id", 
                    x:"$x", 
                    y:"$y", 
                    z:"$z"
                }
            }
        }
    },
    {
        $out : "pdb"
    }
])