我有 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/