MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose findet/aktualisiert Filialdokument

Wie Sie anmerken, ist die Standardeinstellung in Mongoose, dass Sie beim "Einbetten" von Daten in ein Array wie dieses eine _id erhalten Wert für jeden Array-Eintrag als Teil seiner eigenen Unterdokumenteigenschaften. Sie können diesen Wert tatsächlich verwenden, um den Index des Elements zu bestimmen, das Sie aktualisieren möchten. Die MongoDB-Methode dafür ist der positionelle $ operator-Variable, die die "übereinstimmende" Position im Array enthält:

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$": permission
        }
    },
    function(err,doc) {

    }
);

Das .findOneAndUpdate() -Methode gibt das geänderte Dokument zurück, ansonsten können Sie einfach .update() verwenden als Methode, wenn Sie das zurückgegebene Dokument nicht benötigen. Die Hauptteile sind das "Abgleichen" des zu aktualisierenden Elements des Arrays und das "Identifizieren" der Übereinstimmung mit dem positionellen $ wie bereits erwähnt.

Dann verwenden Sie natürlich das $set Operator, sodass nur Die von Ihnen angegebenen Elemente werden tatsächlich "über die Leitung" an den Server gesendet. Sie können dies mit der "Punktnotation" weiterführen und nur die Elemente angeben, die Sie tatsächlich aktualisieren möchten. Wie in:

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$.role": permission.role
        }
    },
    function(err,doc) {

    }
);

Das ist also die Flexibilität, die MongoDB bietet, bei der Sie sehr "zielgerichtet" sein können, wie Sie ein Dokument tatsächlich aktualisieren.

Was dies jedoch tut, ist, jede Logik zu "umgehen", die Sie möglicherweise in Ihr "Mungo"-Schema eingebaut haben, wie z. B. "Validierung" oder andere "Pre-Save-Hooks". Das liegt daran, dass der „optimale“ Weg ein MongoDB-„Feature“ und wie es gestaltet ist. Mongoose selbst versucht, diese Logik zu „bequem“ zu umhüllen. Aber wenn Sie bereit sind, selbst etwas Kontrolle zu übernehmen, dann können die Aktualisierungen optimal durchgeführt werden.

Belassen Sie Ihre Daten daher nach Möglichkeit „eingebettet“ und verwenden Sie keine referenzierten Modelle. Es ermöglicht die atomare Aktualisierung sowohl von „übergeordneten“ als auch von „untergeordneten“ Elementen in einfachen Aktualisierungen, bei denen Sie sich keine Gedanken über Parallelität machen müssen. Wahrscheinlich ist dies einer der Gründe, warum Sie sich überhaupt für MongoDB entschieden haben sollten.