Удалите пути документов JSON и обновите имена полей с помощью jq - PullRequest
0 голосов
/ 13 декабря 2018

Я хотел бы опустить на любую глубину все пути в документе MongoDB JSON и, возможно, изменить каждое имя поля, используя jq (mongo shell, похоже, не способен на это.).В частности, я хотел бы удалить все подчеркивания ("_") во всех именах полей, кроме "_id".Я пробовал различные комбинации recurse и with_entries без успеха.Так, например, преобразуйте это:

{
  "_id": "doc1",
  "field_11": "value_11",
  "field_12": {
    "field_121": {
      "field_1211": "value_1211",
      "field_1212": "value_1212"
    },
    "field_122": {
      "field_1221": "value_1221",
      "field_1222": "value_1222"
    }
  },
  "field_13": [
    {
      "field_131": {
        "field_1311": "value_1311",
        "field_1312": "value_1312"
      },
      "field_132": {
        "field_1321": "value_1321",
        "field_1322": "value_1322"
      }
    }
  ],
  "field_one_four": "value_one_four",
  "Field_One_Five": "Value_One_Five"
}

в это:

{
  "_id": "doc1",
  "field11": "value_11",
  "field12": {
    "field121": {
      "field1211": "value_1211",
      "field1212": "value_1212"
    },
    "field122": {
      "field1221": "value_1221",
      "field1222": "value_1222"
    }
  },
  "field13": [
    {
      "field131": {
        "field1311": "value_1311",
        "field1312": "value_1312"
      },
      "field132": {
        "field1321": "value_1321",
        "field1322": "value_1322"
      }
    }
  ],
  "fieldonefour": "value_one_four",
  "FieldOneFive": "Value_One_Five"
}

Бонус: что, если я хочу удалить подчеркивания и , чтобы преобразовать имена составных полей в camelcase?То есть "field_one_four" станет "fieldOneFour", а "Field_One_Five" станет "fieldOneFive".

1 Ответ

0 голосов
/ 14 декабря 2018

Самое простое - использовать walk:

walk( if type == "object"
      then with_entries( if .key != "_id" then .key |= gsub("_";"") else . end ) 
      else . end)

Если у вашего jq нет walk, вы можете легко найти его def, прибегнув к гуглу: jq "def walk"

Бонус

Вы можете использовать следующую вспомогательную функцию:

def camelcase:
  def u:  if 97 <= . and . <= 122 then . - 32  else . end;
  def c:
    if length <= 1 then
      if .[0] == 95 then [] else . end
    else if .[0] == 95 then [.[1]|u] + (.[2:] | c) else [.[0]] + (.[1:]|c) end
    end;

  explode | c | implode;

Дополнительный бонус

def camel_Case:
  if test("_")
  then .[0:1] as $first
  | if $first | (. ==  ascii_downcase)
    then $first | ascii_upcase + ([2:]|camelcase)
    else camelcase
    end
  else .
  end ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...