MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wstawianie nowych pól (kolumn) do mongoDB za pomocą pand

Potrzebna metoda to update_one() z upsert=True w pętli; nie możesz użyć insert_many() z dwóch powodów; po pierwsze nie zawsze wkładasz; czasami aktualizujesz; po drugie update_many() (i insert_many() ) działają tylko na jednym filtrze; w twoim przypadku każdy filtr jest inny, ponieważ każda aktualizacja dotyczy innego czasu.

Jest to ogólne rozwiązanie, które połączy ramki danych (df_a , df_b w tym przypadku - możesz mieć tyle, ile chcesz) w sposób, jaki potrzebujesz. Używa iterrows aby pobrać każdy wiersz ramki danych, filtruje datę i ustawia wartości na te w ramce danych. $set operator nadpisze wartości, jeśli już tam są, i ustawi je, jeśli nie są ustawione. upsert=True wykona wstawienie, jeśli nie ma dopasowania w dniu.

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)

Pełny przykład pracy:

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)

Wynik:

{'_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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. błąd podczas śledzenia aplikacji Tumblelog za pomocą Flask i MongoEngine

  2. Jak zmienić nazwę/alias pól podczas pobierania ich z MongoDB za pomocą zapytania przy użyciu natywnego dysku MongoDB-Node.JS?

  3. Łączenie aplikacji Heroku z usługą Atlas MongoDB Cloud

  4. gdzie wstawić funkcje w codeigniter mongodb

  5. Zrozumienie Meteor Publish / Subskrybuj