MongoDB - MongoImport JSON (jsonl) - переименовывать, изменять типы и добавлять поля - PullRequest
2 голосов
/ 16 января 2020

Я новичок в topi c MongoDB и имею 4 разных проблемы с импортом большого (16 ГБ) файла (jsonl) в мой MongoDB (простой PSA-кластер).

Ниже прикреплен образец записи из упомянутого JSON -Dump. С этим файлом, который я получаю от внешнего провайдера, у меня на самом деле 4 проблемы.

  1. "hotel_id" - ключ, а должен обычно быть (повторно) названный "_id"
  2. "hotel_id" должен не рассматриваться как строка , а не как Number
  3. "местоположение" - неправильно отформатировано (если я правильно понял, Руководство MongoDB) как Geo JSON, как и должно быть
"location": {
        "type": "Point",
        "coordinates": [-93.26838,37.15845]
}

вместо

"location": {
        "coordinates": {
            "latitude": 37.15845,
            "longitude": -93.26838
        }
    }
"даты" это может быть используется для эффективного обновления только те записи, которые должны быть обновлены?

Так что моя задача сейчас заключается в преобразовании данные в соответствии с моими потребностями до импорта данных или во время импорта, но в обоих случаях, конечно, как можно быстрее.

Поэтому я много искал подсказки и лучшие практики, но я не смог найти решение еще, возможно, из-за того, что я новичок в MongoDB.

Я поигрался с "jq", чтобы скорректировать данные и, например, добавить тип, который кажется необходимым для местоположения (пункт 3), но не был действительно успешным.

cat dump.jsonl | ./bin/jq --arg typeOfField Point '.location + {type: $typeOfField}' 

Кроме того, я вводил пробный дамп объемом около 500 МБ, который занял 1,5 минуты при первом его импорте (пустая база данных). Если я запускаю его в режиме "upsert", это займет около 12 часов. Поэтому мне было интересно, как лучше импортировать такой большой JSON -дамп?

Любая помощь приветствуется !! : -)

С уважением, Lumpy

{
    "hotel_id": "12345",
    "name": "Test Hotel",
    "address": {
        "line_1": "123 Test St",
        "line_2": "Apt A",
        "city": "Test City",
    },
    "ratings": {
        "property": {
            "rating": "3.5",
            "type": "Star"
        },
        "guest": {
            "count": 48382,
            "average": "3.1"
        }
    },
    "location": {
        "coordinates": {
            "latitude": 22.54845,
            "longitude": -90.11838
        }
    },
    "phone": "555-0153",
    "fax": "555-7249",
    "category": {
        "id": 1,
        "name": "Hotel"
    },
    "rank": 42,
    "dates": {
        "added": "1998-07-19T05:00:00.000Z",
        "updated": "2018-03-22T07:23:14.000Z"
    },
    "statistics": {
        "11": {
            "id": 11,
            "name": "Total number of rooms - 220",
            "value": "220"
        },
        "12": {
            "id": 12,
            "name": "Number of floors - 7",
            "value": "7"
        }
    },
    "chain": {
        "id": -2,
        "name": "Test Hotels"
    },
    "brand": {
        "id": 2,
        "name": "Test Brand"
    }
}

...