MongoDB DVS geneste reeks of insertie nieuw document

stemmen
0

Ik gebruik python bibliotheek voor Mongo (pymongo) en mijn document ziet er als volgt:

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

Ik wil nieuwe prijs object te duwen naar de price_history matrix als document id = 12 bestaat. Als dit niet het geval zou ik een nieuw document dat hetzelfde is als het geplakte code look te creëren.

Het lijkt eenvoudig, maar ik heb meerdere StackOverflow onderwerpen en MongoDB documenten gecontroleerd en kan het niet: /

Ik ben gekomen met de code:

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

maar wanneer het document niet wordt gevonden Het neemt alleen VENDOR_ID in plaats van het hele document.

Enige tips? Dank u voor uw tijd besteden aan mijn probleem.

De vraag is gesteld op 03/12/2019 om 00:00
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

Haal de plaat uit in een DICT en gebruik maken van standaard python de manipuleren. Als u gebruik maken find_one()en er is geen wedstrijd het zal terugkerenNone

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))

geeft:

{
    "vendor_id": 12,
    "title": "xyz",
    "price": 1499.0,
    "price_history": [
        {
            "date": "2019-12-01",
            "price": 1890.0
        },
        {
            "date": "2019-12-02",
            "price": 2000.0
        }
    ]
}
antwoordde op 03/12/2019 om 01:13
bron van user

stemmen
2

$setOnInsert te hulp schieten:

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
)
antwoordde op 03/12/2019 om 01:21
bron van user

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