2016-05-12 6 views
0

Например:MongoDB результат запроса из нескольких коллекций и сохранить в одном

1.Using найти, проверить каждую коллекцию:

var objIdMin = ObjectId(Math.floor((new Date('2016/05/01 00:00:00'))/1000).toString(16) + "0000000000000000"); 
var objIdMax = ObjectId(Math.floor((new Date('2016/05/11 00:00:00'))/1000).toString(16) + "0000000000000000"); 

db.getCollection('google').find({ _id:{$gt: objIdMin, $lt: objIdMax}, 'result.text':/phone/}).count(); 

Google Количество коллекции результат 50.

db.getCollection('apple').find({ _id:{$gt: objIdMin, $lt: objIdMax}, 'result.text':/phone/}).count(); 

количество результатов сбора яблок составляет 100.

2.если я вернусь, чтобы достичь своей цели:

var cols = db.getCollectionNames(); 
var objIdMin = ObjectId(Math.floor((new Date('2016/05/01 00:00:00'))/1000).toString(16) + "0000000000000000"); 
var objIdMax = ObjectId(Math.floor((new Date('2016/05/11 00:00:00'))/1000).toString(16) + "0000000000000000"); 

var cols_in = ['google', 'apple']; 
for (var i=0; i<cols_in.length; i++){ 
    db.getCollection(cols_in[i]).aggregate([ { $match: { _id:{$gt: objIdMin, $lt: objIdMax}, 'result.text':/phone/}}, { $out: "target" } ]); 
}; 

Количество результата target collection «s равно 100 (то же самое, как apple collection), поэтому впоследствии коллекция будет перезаписывать бывший, как решить эту проблему?

Edit: Я считаю, что из-за:

Заменить существующую коллекцию

Если коллекция определяется операцией $ из уже существует, то после завершения агрегации , этап $ out атомарно заменяет существующую коллекцию новой коллекцией результатов . Операция $ out не изменяет индексов, существовавших в предыдущей коллекции . Если агрегация завершилась неудачей, операция $ out не делает изменений в уже существующей коллекции.

Итак, единственный способ - просмотреть каждую запись и вставить в другую коллекцию?

ответ

0

согласно комментарию -> в Mongo нет UNION ALL, который мог бы объединять выходные данные из многих запросов в одну логическую часть.

Таким образом, вы решение итерации коллекции с для очень хороший подход, но с каждым пройти перезаписи коллекции выходного имени цели в вашем примере

Чтобы решить эту проблему, в for цикле сохранить агрегацию «выход» как массив, а затем вставить.

Пожалуйста см отрезала ниже:

for (var i = 0; i < cols_in.length; i++) { 
    var documents = db.getCollection(cols_in[i]).aggregate([{ 
       $match : { 
        _id : { 
         $gt : objIdMin, 
         $lt : objIdMax 
        }, 

       } 
      } 
     ]).toArray(); 

     db.target.insert(documents) 
}; 
+0

Я прошу способ без использования для цикла. – Mithril

+0

@ Митрил - отредактированный – profesor79

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