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

パンダを使用してmongoDBに新しいフィールド(列)を挿入する

    必要なメソッドはupdate_one()です。 upsert=Trueを使用 ループで; insert_many()は使用できません 2つの理由で;まず、常に挿入するとは限りません。いつかあなたは更新しています。次に、update_many() (およびinsert_many() )単一のフィルターでのみ機能します。あなたの場合、各更新は異なる時間に関連しているため、各フィルターは異なります。

    これは、データフレーム(df_a)を組み合わせる一般的なソリューションです。 、df_b この場合-必要な数だけ持つことができます)。 iterrowsを使用します データフレームの各行を取得し、日付をフィルタリングし、値をデータフレームの値に設定します。 $set 演算子は、値がすでに存在する場合は値をオーバーライドし、設定されていない場合は設定します。 upsert=True 日付に一致するものがない場合、挿入を実行します。

    for df in [df_a, df_b]:
        for _, row in df.iterrows():
            db.mycollection.update_one({'date': row.get('date')}, {'$set': row.to_dict()}, upsert=True)
    

    完全に機能する例:

    from pymongo import MongoClient
    from pprint import pprint
    import datetime
    import pandas as pd
    
    # Sample data setup
    
    db = MongoClient()['mydatabase']
    
    data_a = [[datetime.datetime(2017, 5, 19, 21, 20), 96, 8, 98],
              [datetime.datetime(2017, 5, 19, 21, 21), 95, 8, 97],
              [datetime.datetime(2017, 5, 19, 21, 22), 95, 8, 97]]
    
    df_a = pd.DataFrame(data_a, columns=['date', 'std_500_1000window', 'std_50_100window', 'std_50_2000window'])
    
    data_b = [[datetime.datetime(2017, 5, 19, 21, 20), 98, 9, 10],
              [datetime.datetime(2017, 5, 19, 21, 21), 98, 9, 10],
              [datetime.datetime(2017, 5, 19, 21, 22), 98, 9, 10]]
    
    df_b = pd.DataFrame(data_b, columns=['date', 'std_50_3000window', 'std_50_300window', 'std_50_500window'])
    
    # Perform the upserts
    
    for df in [df_a, df_b]:
        for _, row in df.iterrows():
            db.mycollection.update_one({'date': row.get('date')}, {'$set': row.to_dict()}, upsert=True)
    
    # Print the results
    
    for record in db.mycollection.find():
        pprint(record)
    

    結果:

    {'_id': ObjectId('5f0ae909df5531ac655ce528'),
     'date': datetime.datetime(2017, 5, 19, 21, 20),
     'std_500_1000window': 96,
     'std_50_100window': 8,
     'std_50_2000window': 98,
     'std_50_3000window': 98,
     'std_50_300window': 9,
     'std_50_500window': 10}
    {'_id': ObjectId('5f0ae909df5531ac655ce52a'),
     'date': datetime.datetime(2017, 5, 19, 21, 21),
     'std_500_1000window': 95,
     'std_50_100window': 8,
     'std_50_2000window': 97,
     'std_50_3000window': 98,
     'std_50_300window': 9,
     'std_50_500window': 10}
    {'_id': ObjectId('5f0ae909df5531ac655ce52c'),
     'date': datetime.datetime(2017, 5, 19, 21, 22),
     'std_500_1000window': 95,
     'std_50_100window': 8,
     'std_50_2000window': 97,
     'std_50_3000window': 98,
     'std_50_300window': 9,
     'std_50_500window': 10}
    



    1. Yiiコンソールアプリケーションで自動ロードされないMongoクラス

    2. 最も効率的なnode.jsプロセス間通信ライブラリ/メソッドは何ですか?

    3. 共有ホスティング環境でMongoDBをセットアップすることは可能ですか?

    4. Mongo / RectiveMongoのリストから参照される値を保存/取得するための最良の方法は?