2016-11-04 11 views
0

У меня есть коллекция MongoDB, имеющая одну подобласти полезной нагрузки документа, который имеет переменное число fields.Sample два Монго документов, как показано нижеКак получить поля вспомогательного документа на верхнем уровне с помощью агрегации без использования проекта в mongodb?

{'key1': 'value1', 
'key2': 'value2', 
'payload': { 'pkey1':'pvalue1', 
       'pkey2':'pvalue2', 
      }  
} 
{'key1': 'value1', 
'key2': 'value2', 
'payload': { 'pkey1':'pvalue1', 
       'pkey2':'pvalue2', 
       'pkey3':'pvalue3', 

      }  
} 

Я хотел бы вывод, что, как показано ниже: `

{'key1': 'value1', 
'key2': 'value2', 
'pkey1':'pvalue1', 
'pkey2':'pvalue2'  
} 
{'key1': 'value1', 
'key2': 'value2', 
'pkey1':'pvalue1', 
'pkey2':'pvalue2', 
'pkey3':'pvalue3' 
} 

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

ответ

1

В настоящее время нет способа сделать это в агрегировании, вам нужно знать поля заранее. Но эта функция может быть представлена ​​в следующих выпусках.

Вам нужно сделать для каждого из них и изменить новые документы, в новой коллекции:

db.test.find().forEach(function(doc) { 
    var new_doc = {}; 
    for (var key in doc) { 

     if (key != 'payload'){ 
      new_doc[key] = doc[key] 
     } 
     else{ 
       for (var key in doc.payload) { 
        new_doc[key] = doc.payload[key] 
       }; 
     } 
    }; 
    db.test2.save(
     new_doc 
    ); 
});