Jak jste si všimli, výchozí v mongoose je, že když „vložíte“ data do pole, jako je toto, získáte _id
hodnotu pro každý záznam pole jako součást jeho vlastních vlastností dílčího dokumentu. Tuto hodnotu můžete skutečně použít k určení indexu položky, kterou chcete aktualizovat. Způsob MongoDB, jak toho dosáhnout, je poziční $
operátorová proměnná, která má "shodovanou" pozici v poli:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$": permission
}
},
function(err,doc) {
}
);
To .findOneAndUpdate()
metoda vrátí upravený dokument, nebo jinak stačí použít .update()
jako metodu, pokud nepotřebujete vrátit dokument. Hlavními částmi jsou „párování“ prvku pole k aktualizaci a „identifikace“, které se shodují s pozičním $
jak bylo zmíněno dříve.
Pak samozřejmě používáte $set
operátor tak, že pouze prvky, které určíte, jsou ve skutečnosti odeslány „po drátě“ na server. Můžete to posunout dále pomocí „tečkové notace“ a stačí zadat prvky, které skutečně chcete aktualizovat. Jako v:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$.role": permission.role
}
},
function(err,doc) {
}
);
Toto je flexibilita, kterou MongoDB poskytuje, kde můžete být velmi "cílení" v tom, jak skutečně aktualizujete dokument.
Co to však dělá, je „obejít“ jakoukoli logiku, kterou jste mohli zabudovat do svého „mongoose“ schématu, jako je „ověření“ nebo jiné „háky před uložením“. To proto, že „optimální“ způsob je „funkce“ MongoDB a způsob, jakým je navržena. Samotný Mongoose se snaží tuto logiku zabalit do „pohodlnosti“. Ale pokud jste připraveni převzít určitou kontrolu sami, pak mohou být aktualizace provedeny tím nejoptimálnějším způsobem.
Takže tam, kde je to možné, mějte svá data „vložená“ a nepoužívejte referenční modely. Umožňuje atomickou aktualizaci položek „rodič“ i „dítě“ v jednoduchých aktualizacích, kde se nemusíte starat o souběžnost. Pravděpodobně je to jeden z důvodů, proč jste si měli vybrat MongoDB na prvním místě.