Конвейер для добавления атрибута к каждому документу в массиве - PullRequest
0 голосов
/ 13 февраля 2020

Мне нужен способ добавить атрибут к каждому документу в массиве документов в конвейере агрегации. Значение атрибута происходит из значений в массиве. В моей коллекции есть такие строки:

{'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.

1 Ответ

1 голос
/ 13 февраля 2020

Просто создайте свой барный объект, где вы делаете это для foo:

db.collection.aggregate([
  {
    $addFields: {
      "b": {
        $map: {
          input: "$b",
          in: {
            "foo": "$$this",
            "bar": {
              this_value: "$$this.this"
            }
          }
        }
      }
    }
  }
])

Вы можете проверить его здесь

...