我有大量的文档(超过两百万)我发现我的自我查询只是一小部分。使用像
这样的东西scs = db.balance_sheets.find({"9087n":{$gte:40}, "20/58n":{ $lte:40000000}})
,结果不到5k。问题是,我可以使用此查询的结果创建新集合吗? 我试过插入:
db.scs.insert(db.balance_sheets.find({"9087n":{$gte:40}, "20/58n":{ $lte:40000000}}).toArray())
但是它给了我错误:Socket say send()errno:32 Broken pipe 127.0.0.1:27017 我试着聚合:
db.balance_sheets.aggregate([{ "9087n":{$gte:40}, "20/58n":{ $lte:40000000}} ,{$out:"pme"}])
我得到"异常:管道阶段规范对象必须只包含一个字段。" 任何提示? 感谢
答案 0 :(得分:1)
第一个选项是:
DO $$
DECLARE
drop_stmt text;
BEGIN
FOR drop_stmt IN
SELECT CONCAT('DROP TABLE ', table_schema,'.',table_name) AS stmt
FROM information_schema.TABLES
WHERE table_schema='public' AND table_catalog='capsana' LOOP
EXECUTE drop_stmt;
END LOOP;
END$$;
关于聚合,请尝试
var cursor = db.balance_sheets.find({"9087n":{"$gte": 40}, "20/58n":{ $lte:40000000}});
while (cursor.hasNext()) {
var doc = cursor.next();
db.pme.save(doc);
};
为了提高性能,尤其是在处理大型集合时,请利用 Bulk API 进行批量更新,因为您将以500个批量发送操作到服务器您可以获得更好的性能,因为您不是每次请求都向服务器发送每个请求。
以下演示了此方法,第一个示例使用MongoDB版本db.balance_sheets.aggregate([
{
"$match": { "9087n": { "$gte": 40 }, "20/58n": { "$lte": 40000000 } }
},
{ "$out": "pme" }
]);
中提供的批量API将与>= 2.6 and < 3.2
集合中的查询匹配的所有文档插入到balance_sheets
集合中:
pme
下一个示例适用于自 deprecated the Bulk API 以来的新MongoDB版本var bulk = db.pme.initializeUnorderedBulkOp(),
counter = 0;
db.balance_sheets.find({
"9087n": {"$gte": 40},
"20/58n":{ "$lte":40000000}
}).forEach(function (doc) {
bulk.insert(doc);
counter++;
if (counter % 500 == 0) {
bulk.execute(); // Execute per 500 operations
// and re-initialize every 1000 update statements
bulk = db.pme.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 500 != 0) { bulk.execute(); }
,并使用 bulkWrite()
提供了一套更新的api强>:
3.2