在mongodb中从集合子集中创建集合

时间:2016-02-13 18:54:08

标签: mongodb

我有大量的文档(超过两百万)我发现我的自我查询只是一小部分。使用像

这样的东西
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"}])

我得到"异常:管道阶段规范对象必须只包含一个字段。" 任何提示? 感谢

1 个答案:

答案 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()

3.2