MongoDB trykk for å sammensatt gruppe eller innsatsen nytt dokument

stemmer
0

Jeg bruker python bibliotek for Mongo (pymongo) og mine dokument ser slik ut:

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

Jeg ønsker å få nye prisen objekt til price_history array hvis dokument med id = 12 eksisterer. Hvis den ikke gjør det jeg vil opprette et nytt dokument som ser det samme som limes kode.

Det virker enkelt, men jeg har sjekket flere Stackoverflow emner og mongodb docs og kan ikke få det: /

Jeg har kommet opp med koden:

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

men når dokumentet ikke er funnet Det setter bare VENDOR_ID i stedet for hele dokumentet.

Noen tips? Takk for at du bruker tiden din på mitt problem.

Publisert på 03/12/2019 klokken 00:00
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Hente posten ut i en dict og bruke standard python den manipulere. Hvis du bruker find_one()og det er ingen kamp vil den komme tilbakeNone

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

gir:

{
    "vendor_id": 12,
    "title": "xyz",
    "price": 1499.0,
    "price_history": [
        {
            "date": "2019-12-01",
            "price": 1890.0
        },
        {
            "date": "2019-12-02",
            "price": 2000.0
        }
    ]
}
Svarte 03/12/2019 kl. 01:13
kilden bruker

stemmer
2

$setOnInsert til redning:

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
)
Svarte 03/12/2019 kl. 01:21
kilden bruker

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