我有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时插入会更有效。
任何建议都会有所帮助。
答案 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"
}
])