Применить прописные буквы во всех полях всех документов (MongoDB - агрегат) - PullRequest
1 голос
/ 25 января 2020

Предположим, что у меня есть такие документы:

[
  {
    "one": "aaa",
    "two": "bbb",
    "three": "aba"
  },
  {
    "one": "dd",
    "two": "cc",
  }
]

Есть ли способ (с агрегатом) применить функцию к каждому полю? Как это?

db.collection.aggregate([
{
   '$project': {
     'SOME FUNCTION TO UPPERCASE ALL THE FIELDS IN A ONCE'
    }
}
])

Ожидаемый результат:

[
  {
    "one": "AAA",
    "two": "BBB",
    "three": "ABA"
  },
  {
    "one": "DD",
    "two": "CC",
  }
]

1 Ответ

1 голос
/ 25 января 2020

Пожалуйста, попробуйте это:

db.collection.aggregate([{
    /** Adding a new field data with required format */
    $addFields: {
        data: {
            $arrayToObject: { // Convert back to object (Executes as final step in this addFields)
                $map:
                {
                    input: { $objectToArray: "$$ROOT" }, // Convert each document's keys as k,v pairs 
                    as: "each",
                    /** Iterate over each document's keys & make values into upper case if k != _id */
                    in: { $cond: [{ $eq: ['$$each.k', '_id'] }, '$$each', { k: '$$each.k', v: { $toUpper: '$$each.v' } }] }
                }
            }
        }
    }
},
/** Replacing data as root document for each respective actual document  */
{ $replaceRoot: { newRoot: '$data' } }])

Тест: MongoDB-Playground

Ссылка: MongoDB-агрегация

...