sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB aktualizuje všechna pole chyby pole

UPRAVIT

V otázce chyběl detail, že požadované pole k aktualizaci bylo ve skutečnosti v dílčím dokumentu . To značně mění odpověď:

Toto je omezení toho, co možná můžete udělat s aktualizací prvků pole. A to je jasně vysvětleno v dokumentaci . Většinou v tomto odstavci:

Takže tady je ta věc. Pokus o aktualizaci všech prvků pole v jediném příkazu, jako je tento, nebude práce. Chcete-li to provést, musíte provést následující.

db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
    doc.items.forEach(function(item) {
        item.qty = 0;
    });
    db.warehouses.update({ "_id": doc._id }, doc );
})

Což je v podstatě způsob, jak aktualizovat každý prvek pole.

Multi nastavení v .update() znamená napříč více „dokumenty“. Nemůže být aplikován na více prvků pole. Takže v současné době je nejlepší možností vyměnit celou věc. Nebo v tomto případě můžeme stejně dobře nahradit celek dokument, protože to stejně musíme udělat.

skutečně hromadná data, použijte db.eval() . Ale přečtěte si nejprve dokumentaci:

db.eval(function() {
    db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
        doc.items.forEach(function(item) {
            item.qty = 0;
        });
        db.warehouses.update({ "_id": doc._id }, doc );
    });
})

Aktualizace všech prvky v poli napříč celkem sběr není jednoduchý.

Původní

Téměř přesně to, co chyba říká. Abyste mohli použít poziční operátor, musíte se shodovat nejdřív něco. Jako v:

db.warehouses.update(
    // query 
    {
        _id:ObjectId('5322f07e139cdd7e31178b78'),
        "items.qty": { "$gt": 0 }
    },    
    // update 
    {
        $set:{"items.$.qty":0}
    },    
    // options 
    {
        "multi" : true,  
        "upsert" : true  
    }
);

Kde je tedy shoda podmínka zaujímá polohu z položek, které jsou méně než 0, pak tento index je předán pozičnímu operátoru.

P.S. :Když muti je pravda to znamená, že se aktualizuje každý dokument. Ponechte false pokud máte na mysli pouze jeden . Což je výchozí.



  1. Docker-compose – Redis na 0.0.0.0 místo 127.0.0.1

  2. MongoDB:Jak získat přesnost N desetinných míst v dotazu

  3. Jak zobrazit verzi funkce kompatibility v MongoDB

  4. Proč nápověda Mongo umožňuje spuštění dotazu až 10krát rychleji?