Как я могу получить поля вложенных документов на верхнем уровне, используя агрегацию, без использования проекта в 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
);
});