MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Вмъкване на нови полета (колони) в mongoDB с pandas

Методът, от който се нуждаете, е update_one() с upsert=True в цикъл; не можете да използвате insert_many() по две причини; първо не винаги вмъквате; понякога актуализирате; второ 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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Големи работни потоци от данни с помощта на панди

  2. MongoDB - трябва ли моят потребителски документ да съдържа списък с идентификатори на проекти?

  3. $lookup с помощта на mongoose

  4. Spark не изпълнява задачи

  5. Разбиране на WriteConcern в MongoDB C#