MongoDB pousser à tableau imbriqué ou insert nouveau document

voix
0

J'utilise la bibliothèque de python pour Mongo (pymongo) et mon document ressemble à ceci:

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

Je voudrais pousser nouvel objet de prix au tableau « price_history » si le document avec id = 12 existe. Si elle ne le fait pas, je voudrais créer un nouveau document le même aspect que le code collé.

Il semble simple, mais je l'ai vérifié plusieurs sujets stackoverflow et MongoDB docs et ne peut l'obtenir: /

Je suis venu avec le code:

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

mais lorsque le document ne se trouve pas seulement il insère VENDOR_ID au lieu de document.

Des conseils? Merci de passer votre temps sur mon problème.

Créé 03/12/2019 à 00:00
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Fetch le dossier sur dans un dict et utiliser python standard , le manipuler. Si vous utilisez find_one()et il n'y a pas de match , il retourneraNone

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

donne:

{
    "vendor_id": 12,
    "title": "xyz",
    "price": 1499.0,
    "price_history": [
        {
            "date": "2019-12-01",
            "price": 1890.0
        },
        {
            "date": "2019-12-02",
            "price": 2000.0
        }
    ]
}
Créé 03/12/2019 à 01:13
source utilisateur

voix
2

$setOnInsert à la rescousse:

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
)
Créé 03/12/2019 à 01:21
source utilisateur

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