नेस्टेड सरणी करने के लिए या नया दस्तावेज़ डालने MongoDB धक्का

वोट
0

मैं मोंगो (pymongo) और इस तरह अपने दस्तावेज़ दिखता है के लिए अजगर के पुस्तकालय का उपयोग कर रहा:

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

मैं price_history सरणी के लिए नए मूल्य वस्तु पुश करने के लिए करता है, तो आईडी = 12 के साथ दस्तावेज़ मौजूद चाहते हैं। मुझे लगता है कि चिपकाया कोड जैसे ही दिखते हैं एक नया दस्तावेज़ बनाने होगा ऐसा नहीं होता है।

यह आसान लगता है, लेकिन मैं कई stackoverflow विषयों और MongoDB डॉक्स की जाँच की है और यह नहीं मिल सकता है: /

मैं कोड के साथ आ गया है:

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

लेकिन जब दस्तावेज़ नहीं मिला है यह केवल बजाय पूरे दस्तावेज के VENDOR_ID सम्मिलित करता है।

कोई सुझाव? मेरी समस्या पर अपना समय खर्च करने के लिए धन्यवाद।

03/12/2019 को 00:00
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
1

एक dict में रिकॉर्ड बाहर लायें और मानक अजगर का उपयोग में हेरफेर। आप का उपयोग करते हैं find_one()और वहाँ कोई मुकाबला नहीं है, यह वापस आ जाएगीNone

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

देता है:

{
    "vendor_id": 12,
    "title": "xyz",
    "price": 1499.0,
    "price_history": [
        {
            "date": "2019-12-01",
            "price": 1890.0
        },
        {
            "date": "2019-12-02",
            "price": 2000.0
        }
    ]
}
03/12/2019 को 01:13
का स्रोत उपयोगकर्ता

वोट
2

$setOnInsert बचाव के लिए:

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
)
03/12/2019 को 01:21
का स्रोत उपयोगकर्ता

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