Мне нужен способ добавить атрибут к каждому документу в массиве документов в конвейере агрегации. Значение атрибута происходит из значений в массиве. В моей коллекции есть такие строки:
{'a': 1, 'b': [{ 'this': 'A', 'that': 'B', 'other': 'C' }], 'c': 2},
{'a': 3, 'b': [{ 'this': 'D', 'that': 'E', 'other': 'F' }, {'this': 'G', 'that': 'H', 'other': 'I'}], 'c': 4}
Я хочу превратить каждый «b» в массив документов с двумя атрибутами: «foo» и «bar». Каждый элемент «b» станет «foo». Значение 'bar' - это объект с атрибутом, значение которого происходит из атрибута 'A' в 'foo'.
Я не хочу записывать результат обратно в коллекцию.
Вот преобразования, которые я хочу сделать:
{ "a" : 1, "b" : [ { "bar": { "this_value": "A"}, "foo" : { "this" : "A", "that" : "B", "other" : "C" } } ], "c" : 2 }
{ "a" : 3, "b" : [ { "bar": { "this_value": "D"}, "foo" : { "this" : "D", "that" : "E", "other" : "F" } }, { "bar" : { "this_value": "G" }, "foo" : { "this" : "G", "that" : "H", "other" : "I" } } ], "c" : 4 }
В Как сделать изменив элементы поля массива на значения dict с единственным атрибутом в MongoDB , я узнал, как создавать атрибуты "foo":
t.aggregate( [{$addFields: {'b': { $map: { input: '$b', in: {'foo': '$$this'}}}}} ] )
Я застрял на том, как добавить Атрибуты "bar".
Вот команды оболочки Mon go для создания моей коллекции и часть "foo" преобразования:
c = new Mongo()
db = c.getDB('playful')
t = db['things']
t.insertMany([{'a': 1, 'b': [{ 'this': 'A', 'that': 'B', 'other': 'C' }], 'c': 2}, {'a': 3, 'b': [{ 'this': 'D', 'that': 'E', 'other': 'F' }, {'this': 'G', 'that': 'H', 'other': 'I'}], 'c': 4}])
t.aggregate( [{$addFields: {'b': { $map: { input: '$b', in: {'foo': '$$this'}}}}} ] )
Я использую MongoDB 4.2. 2 в Ubuntu 18.04.