2016-02-13 3 views
1

У меня есть огромная коллекция документов (более двух миллионов), и я обнаружил, что я сам запрашиваю очень небольшое подмножество. используя что-то вродеСоздание коллекции из подмножества коллекции в 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 сказать отправить() ERRNO: 32 Сломанная труба 127.0.0.1:27017 I tryied агрегат:

db.balance_sheets.aggregate([{ "9087n":{$gte:40}, "20/58n":{ $lte:40000000}} ,{$out:"pme"}]) 

И я получаю «исключение: объект спецификации этапа трубопровода должен содержать ровно одно поле». Любые подсказки? Благодаря

ответ

1

Первый вариант был бы:

var cursor = db.balance_sheets.find({"9087n":{"$gte": 40}, "20/58n":{ $lte:40000000}}); 
while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    db.pme.save(doc); 
}; 

Как для агрегации, попробуйте

db.balance_sheets.aggregate([ 
    { 
     "$match": { "9087n": { "$gte": 40 }, "20/58n": { "$lte": 40000000 } } 
    }, 
    { "$out": "pme" } 
]); 

Для повышения производительности, особенно при работе с большими коллекциями, воспользоваться помощью Bulk API для массовых обновлений, так как вы будете отправлять операции на сервер пакетами 500, что дает вам лучшую производительность, поскольку вы не отправляете каждый запрос uest на сервер, всего один раз в каждых 500 запросах.

Ниже демонстрирует такой подход, первый пример использует Bulk API, доступные в версиях MongoDB >= 2.6 and < 3.2 вставить все документы, соответствующие запросу из balance_sheets коллекции в pme коллекции:

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(); } 

Следующий пример относится в новой версии MongoDB 3.2 который с тех пор deprecated the Bulk API и при условии, более новый набор API-интерфейсов с использованием bulkWrite():

var bulkOps = db.balance_sheets.find({ 
    "9087n": { "$gte": 40 }, 
    "20/58n": { "$lte": 40000000 } 
}).map(function (doc) { 
    return { "insertOne" : { "document": doc } };  
}); 

db.pme.bulkWrite(bulkOps); 
+0

Спасибо @chridam Мне понравился первый, хотя в pyhton. Остальные дают мне ошибки. –

Смежные вопросы