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

标签 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 属性和数组(原子)组成,该数组(原子)保存同一 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 时插入会更有效。

任何建议都会有帮助。

最佳答案

这可以使用单个 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"
    }
])

关于mongodb - Mongodb 使用数组将多个文档聚合并转换为单个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24534745/

相关文章:

MongoDB 文本索引错误 : language override not supported

node.js - 如何根据另一个属性选择一个属性 - mongodb

java - 使用 mongo 聚合合并文档中的数组

mongodb - 根据字段的存在或不存在在投影管道中实现 mongo $cond 字段

MongoDB 匹配索引与无索引 - 聚合

mongodb - 关于 mongoDB 的聚合难题?

mongodb - 如何存储大量用户特定数据

javascript - 我应该如何在没有cookie和外部模块的情况下在nodejs中创建多语言

node.js - 统计 Mongo 中引用对象的数量

javascript - 如何对异步映射函数执行递归