MongoDb - обновить несколько подкаталогов - PullRequest
0 голосов
/ 03 марта 2020

Я новичок в MongoDb

Здесь я упомянул документ

{
"_id" : ObjectId("5e5bc292361b710c7727718e"),
"branch_id" : "BR5cc825dac42dac3aae49ff91",
"inventory" : [ 
    {
        "inventory_stock_id" : "MED344",
        "stock_name" : "Anacin123",
        "stock_point" : "27",
        "stock_type" : "Medicine",
        "batch" : [ 
            {
                "quantity" : 40,
                "manuf_date" : "10-01-2020",
                "exp_date" : "01-04-2020"
            }, 
            {
                "quantity" : 60,
                "manuf_date" : "15-02-2020",
                "exp_date" : "03-03-2020"
            }
        ]
    }
  ]
}

Мне даны значения branch_id = "BR5cc825dac42dac3aae49ff91", inventory_stock_id = "MED344" и количество равно 50

Это мой запрос, заданный , но он сравнивает пакет: [{}, {сравнить этот каталог}]

db.collection.update_many(
                                { "branch_id": "BR5cc825dac42dac3aae49ff91" },
                                { "$inc": {"inventory.$[item].batch.$[b].quantity": -50}},
                                array_filters= [
                                    {"item.inventory_stock_id": "MED344"},
                                    {"b.quantity": { "$gte": 50}}
                                ]
                                )

Мой запрос задан Результат

"_id" : ObjectId("5e5bc292361b710c7727718e"),
"branch_id" : "BR5cc825dac42dac3aae49ff91",
"inventory" : [ 
    {
        "inventory_stock_id" : "MED344",
        "stock_name" : "Anacin123",
        "stock_point" : "27",
        "stock_type" : "Medicine",
        "batch" : [ 
            {
                "quantity" : 40,
                "manuf_date" : "10-01-2020",
                "exp_date" : "01-04-2020"
            }, 
            {
                "quantity" : 10,
                "manuf_date" : "15-02-2020",
                "exp_date" : "03-03-2020"
            }
        ]
    }
  ]
}

Ожидаемый результат

{
"_id" : ObjectId("5e5bc292361b710c7727718e"),
"branch_id" : "BR5cc825dac42dac3aae49ff91",
"inventory" : [ 
    {
        "inventory_stock_id" : "MED344",
        "stock_name" : "Anacin123",
        "stock_point" : "27",
        "stock_type" : "Medicine",
        "batch" : [ 
            {
                "quantity" : 0,
                "manuf_date" : "10-01-2020",
                "exp_date" : "01-04-2020"
            }, 
            {
                "quantity" : 50,
                "manuf_date" : "15-02-2020",
                "exp_date" : "03-03-2020"
            }
        ]
    }
  ]
}

Как мне получить ожидаемый результат, если кто-нибудь поможет мне

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Здесь упоминается использование python, и оно обновит несколько полей словаря, что я ожидаю

 inventory_item_update = self.collection.find({'branch_id':"BR5cc825dac42dac3aae49ff91", "inventory.inventory_stock_id": "MED344"}) 
 quantity = 50
 update_query ={}
 if inventory_item_update:
    for cursor in inventory_item_update:
        for batch in cursor['inventory'][0]['batch']:
            if batch['quantity'] <= quantity:
               quantity = quantity-batch['quantity']
               batch['quantity'] =0
            if batch['quantity'] >= quantity:
                  quantity = batch['quantity'] -quantity
                  batch['quantity'] = quantity
         update_query = cursor
    update_result=self.collection.save(update_query)
0 голосов
/ 03 марта 2020

Используйте это Обходное решение :

db.collection.update(
    { "branch_id": "BR5cc825dac42dac3aae49ff91" },
    [{ "$set": {
        inventory: {
            $map: {
                input: "$inventory",
                as : 'inv',
                in: {
                    "inventory_stock_id" : "$$inv.inventory_stock_id",
                    "stock_name" : "$$inv.stock_name",
                    "stock_point" : "$$inv.stock_point",
                    "stock_type" : "$$inv.stock_type",
                    "batch" : {$cond:[{$ne:["$$inv.inventory_stock_id", "MED344"]}, "$$inv.batch", {
                        $map:{
                            input:"$$inv.batch",
                            as:"batch",
                            in:{
                                "quantity" : {$cond:[{$lt:["$$batch.quantity", 50]}, 0, 50]},
                                "manuf_date" : "$$batch.manuf_date",
                                "exp_date" : "$$batch.exp_date"
                            }
                        }
                    }]}
                }
            }
        }
    }}],
    {multi:true}
)

Я ищу более простое решение, чем это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...