MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Chèn các trường (cột) mới vào mongoDB với gấu trúc

Phương thức bạn cần là update_one() với upsert=True trong một vòng lặp; bạn không thể sử dụng insert_many() Vì hai lý do; trước hết bạn không phải lúc nào cũng chèn; đôi khi bạn đang cập nhật; thứ hai là update_many() (và insert_many() ) chỉ hoạt động trên một bộ lọc duy nhất; trong trường hợp của bạn, mỗi bộ lọc khác nhau vì mỗi bản cập nhật liên quan đến một thời điểm khác nhau.

Đây là giải pháp chung sẽ kết hợp các khung dữ liệu (df_a , df_b trong trường hợp này - bạn có thể có bao nhiêu tùy thích) theo cách bạn cần. Nó sử dụng iterrows để lấy từng hàng của khung dữ liệu, lọc ngày và đặt các giá trị cho các hàng trong khung dữ liệu. $set toán tử sẽ ghi đè các giá trị nếu chúng đã ở đó và đặt chúng nếu chưa được đặt. upsert=True sẽ thực hiện chèn nếu không có ngày trùng khớp.

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)

Ví dụ hoạt động đầy đủ:

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)

Kết quả:

{'_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. Làm cách nào để duyệt hoặc truy vấn dữ liệu MongoDB trực tiếp?

  2. Kiểm tra Spring Data MongoDB không hoạt động đối với các tài liệu nhúng

  3. Đếm thuộc tính tài liệu con trong một phép chiếu bằng cách sử dụng MongoDB và Javascript

  4. Các mô-đun mongodb_user, mongodb_replicaset ansible hoạt động như thế nào?

  5. System.FormatException 'xảy ra trong MongoDB.Bson.dll - XXX không phải là chuỗi hex 24 chữ số hợp lệ