MongoDB Push-to-verschachteltes Array oder Insert neues Dokument

stimmen
0

Ich verwende Python-Bibliothek für Mongo (pymongo) und mein Dokument sieht wie folgt aus:

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

Ich mag neuen Preis Objekt in die „price_history“ Array drücken, wenn Dokument mit id = 12 existiert. Wenn dies nicht der Fall würde ich ein neues Dokument erstellen, die die gleiche wie die eingefügten Code aussehen.

Es scheint einfach, aber ich habe mehr Stackoverflow Themen und mongodb docs geprüft und kann sie nicht: /

Ich habe mit dem Code kommen:

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

aber wenn das Dokument nicht gefunden fügt es nur statt gesamten Dokument VENDOR_ID.

Irgendwelche Tipps? Vielen Dank für Ihre Zeit auf meinem Problem zu verbringen.

Veröffentlicht am 03/12/2019 um 00:00
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Holt den Datensatz aus in einem dict und verwenden Standard - Python die manipulieren. Wenn Sie verwenden , find_one()und es gibt keine Übereinstimmung wird es zurückkehrenNone

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

gibt:

{
    "vendor_id": 12,
    "title": "xyz",
    "price": 1499.0,
    "price_history": [
        {
            "date": "2019-12-01",
            "price": 1890.0
        },
        {
            "date": "2019-12-02",
            "price": 2000.0
        }
    ]
}
Beantwortet am 03/12/2019 um 01:13
quelle vom benutzer

stimmen
2

$setOnInsert zur Rettung:

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
)
Beantwortet am 03/12/2019 um 01:21
quelle vom benutzer

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