Как поместить несколько json записей в mongoDB? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть Json большой json данные в большом файле в следующем формате:

{"created_at":"Wed Apr 15 16:59:38 +0000 2020","id":1250468838409490432,"id_str":"1250468838409490432"}

{"created_at":"Thu Apr 16 16:59:38 +0000 2020","id":1250468838404390433,"id_str":"1250468838409490433"}
.....................
.....................




 millions of rows




.....................

Я уже пробовал много разных вещей, например:

mongoimport --jsonArray --db YourDatabase --collection YourCollection --file Yourfile.json

Это не помогает и выдает ошибку:

 E  QUERY    [js] uncaught exception: SyntaxError: unexpected token: identifier :

Я также пробовал написать специальную программу python, но это тоже не помогло:

import json
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['twitter']
collection = db['myCollection']

with open('C:\\myDatata.json') as f:
    for line in f:
        document = (DBObject) JSON.parse(line)
        collection.insert(document)

client.close()

Это дает у меня разные ошибки.

Я понимаю, читая другие ответы, например

Неожиданный конец ввода JSON в MongoDB Compass

Вставьте файл json в mongodb

, что новой строки не должно быть, и все, кроме данных, слишком велико для обработки. Я пробовал то же самое с помощью Compass, но не смог. Когда я копирую одну запись, я могу вставить ее с помощью опции компаса insert data, но не могу вставить две или более строк. Если я выберу импорт данных и передам свой файл JSON, Compass выдаст ошибку, сообщив об ошибке в данных.

Понятия не имею, что делать. Я ищу какую-то программу python, вероятно, модификацию того, что у меня есть, с помощью которой я могу вставлять данные в БД. Или любой другой способ вставить такой большой документ в базу данных с помощью Compass, командной строки mon go или python.

1 Ответ

0 голосов
/ 06 мая 2020

, если файл действительно большой, как вы говорите Mon go, проверьте ограничение размера:

[https://docs.mongodb.com/manual/core/document/] [1]

вы можете попробовать чтобы сжать файл JSON с помощью:

ZIPJSON_KEY = 'base64(zip(o))'

def json_zip(j):

    j = {
        ZIPJSON_KEY: base64.b64encode(
            zlib.compress(
                json.dumps(j).encode('utf-8')
            )
        ).decode('ascii')
    }

    return j

def mongoinsertone(path):
        file_data = json_zip(path)
        # conncect to the specific collection on MongoDB
        collection = db["collection name here"]
        # delete previous version and replace it with new one
        collection.delete_many({})
        collection.insert_one(file_data)
        return file_data

mongoinsertone("file path here")

, затем, когда вы откатываете файл, убедитесь, что вы распаковали его.

ZIPJSON_KEY = 'base64(zip(o))'
def json_unzip(j, insist=True):
    try:
        assert (j[ZIPJSON_KEY])
        assert (set(j.keys()) == {ZIPJSON_KEY})
    except:
        if insist:
            raise RuntimeError("JSON not in the expected format {" + str(ZIPJSON_KEY) + ": zipstring}")
        else:
            return j

    try:
        j = zlib.decompress(base64.b64decode(j[ZIPJSON_KEY]))
    except:
        raise RuntimeError("Could not decode/unzip the contents")

    try:
        j = json.loads(j)
    except:
        raise RuntimeError("Could interpret the unzipped contents")

    return j
...