sql >> データベース >  >> NoSQL >> MongoDB

Mongodbはダンプできますが、からの復元エラーを保存できません挿入が大きすぎます

    私の解決策は、BSONファイルを手動で(Pythonを使用して)開き、大きなドキュメントを見つけてその一部を削除してから、BSONオブジェクトを新しいBSONファイルに書き込み、編集されたBSONファイルをロードすることでした。これはmongoに正常に保存されました。

    これは、ダンプされたデータベースを変更せずにシステムにロードできるようにするという私の望みを満たしていません!

    Python3:

    import bson
    from pprint import pprint
    
    def get_bson_data(filename):
        with open(filename, "rb") as f:
            data = bson.decode_all(f.read())
    
        return data
    
    
    def report_problematics_documents(data):
        problematics = []
    
        for item in data:
            if is_too_big(item):
                print(item)input("give me some more...")
                input("give me some more...")
                problematics.append(item)
    
        print(f"data len: {len(data)}")
        print(f"problematics: {problematics}")
        print(f"problematics len: {len(problematics)}")
            
    
    def shrink_data(data):
        for i,  item in enumerate(data):
            if is_too_big(item):
                data[i] = shrink_item(item) # or delete it...
                print(f"item shrinked: {i}")
    
    
    def write_bson_file(data, filename):
        new_filename = filename
        with open(new_filename, "wb") as f:
            for event in data:
                bson_data = bson.BSON.encode(event)
                f.write(bson_data)
    
    def is_too_big(item):
        # you need to implement this one...
        pass
    
    
    def shrink_item(item):
        # you need to implement this one...
        pass
    
    
    def main():
        bson_file_name = "/path/to/file.bson"
        data = get_bson_data(bson_file_name)
        report_problematics_documents(data)
    
        shrink_data(data)
        report_problematics_documents(data)
    
        new_filename = bson_file_name + ".new"
        write_bson_file(data, new_filename)
        
        print("Load new data")
        data = get_bson_data(new_filename)
        report_problematics_documents(data)
    
    if __name__ == '__main__':
        main()
    



    1. mongodbは、取得した各ドキュメントにカウンターを追加します

    2. モデル属性にオブジェクトのコレクションが含まれています

    3. MongoDB:大文字と小文字を区別せず、アクセントを区別しない

    4. Mongoidは制限付きで多くを削除します