Как я могу получить поля вложенных документов на верхнем уровне, используя агрегацию, без использования проекта в mongodb?

У меня есть коллекция mongodb с одним вспомогательным документом, который имеет переменное количество полей. Пример двух документов mongo, как показано ниже

{'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
    );
});
Другие вопросы по тегам