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

Извлекает запись из в Словаре и использовать стандартный питон манипулировать. Если вы используете 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