İç içe diziye veya yeni bir belge eki MongoDB itme

oy
0

Böyle Mongo (pymongo) ve benim belge görünüşleri için Python kütüphanesi kullanıyorum:

{vendor_id: 12, title: xyz, price: 1499.0, price_history: [{date: 2019-12-01, price: 1890.0}]}

Ben id = 12 ile belge varsa price_history dizisine yeni fiyat nesneyi itmek istiyorum. Böyle olmazsa ben yapıştırılan koduyla aynı bakmak yeni bir belge oluşturacak.

Çok basit görünüyor ama birden stackoverflow konuları ve mongodb dokümanlar kontrol ettim ve bunu elde edemez: /

Ben kodu ile geldim:

db.holidays.update_one(
            {vendor_id: t[vendor_id]},
            {$push: {price_history: t[price_history][0]}},
            upsert=True
        )

belge bulunamadı olduğunda ancak yalnızca tamamı yerine belgenin VENDOR_ID ekler.

Herhangi bir ipucu? Benim problem üzerinde vakit geçirmek için teşekkür ederiz.

Oluştur 03/12/2019 saat 00:00
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Bir dict içine rekor dışarı Getir ve manipüle standart python kullanmak. Eğer kullanırsanız find_one()ve eşleşen bir o dönecektirNone

from pymongo import MongoClient
from bson.json_util import dumps

db = MongoClient()["testdatabase"]

# Data setup
db.testcollection.delete_many({})
template = {"vendor_id": 12, "title": "xyz", "price": 1499.0, "price_history": []}
data_setup = {"vendor_id": 12, "title": "xyz", "price": 1499.0,
              "price_history": [{"date": "2019-12-01", "price": 1890.0}]}
new_price = {"date": "2019-12-02", "price": 2000.0}

# Comment the next line out to see what happens if the record isn't present
db.testcollection.insert_one(data_setup)

record = db.testcollection.find_one({"vendor_id": 12})
if record is None:
    record = template

record['price_history'].append(new_price)
db.testcollection.replace_one({"vendor_id": 12}, record, upsert=True)

# Pretty up the record output
print(dumps(db.testcollection.find_one({}, {'_id': 0}), indent=4))

verir:

{
    "vendor_id": 12,
    "title": "xyz",
    "price": 1499.0,
    "price_history": [
        {
            "date": "2019-12-01",
            "price": 1890.0
        },
        {
            "date": "2019-12-02",
            "price": 2000.0
        }
    ]
}
Cevap 03/12/2019 saat 01:13
kaynak kullanıcı

oy
2

$setOnInsert kurtarmak için:

db.holidays.update(
   { "vendor_id": t["vendor_id" },   // Query parameter
   ,{                     // Update document
      "$push": {"price_history": t["price_history"][0]},
      "$setOnInsert": { everything else you want insert besides the push and the vendor_id
   }
   ,{ upsert: true }      // Options
)
Cevap 03/12/2019 saat 01:21
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more