sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose buscar/actualizar subdocumento

Entonces, como observa, el valor predeterminado en mongoose es que cuando "incrusta" datos en una matriz como esta, obtiene un _id valor para cada entrada de matriz como parte de sus propias propiedades de subdocumento. En realidad, puede usar este valor para determinar el índice del elemento que desea actualizar. La forma de MongoDB de hacer esto es el posicional $ variable de operador, que mantiene la posición "coincidente" en la matriz:

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

    }
);

Que .findOneAndUpdate() devolverá el documento modificado o, de lo contrario, puede usar .update() como método si no necesita que le devuelvan el documento. Las partes principales son "hacer coincidir" el elemento de la matriz para actualizar e "identificar" que coincidan con el $ posicional como se mencionó anteriormente.

Entonces, por supuesto, está utilizando el $set operador para que solo los elementos que especifique en realidad se envían "por cable" al servidor. Puede llevar esto más lejos con la "notación de puntos" y simplemente especificar los elementos que realmente desea actualizar. Como en:

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

    }
);

Así que esta es la flexibilidad que ofrece MongoDB, donde puede estar muy "orientado" en la forma en que realmente actualiza un documento.

Sin embargo, lo que sí hace es "pasar por alto" cualquier lógica que haya incorporado en su esquema de "mangosta", como "validación" u otros "ganchos de pre-guardado". Esto se debe a que la forma "óptima" es una "característica" de MongoDB y cómo está diseñada. Mongoose en sí trata de ser un envoltorio de "conveniencia" sobre esta lógica. Pero si está preparado para tomar el control usted mismo, entonces las actualizaciones se pueden realizar de la manera más óptima.

Entonces, cuando sea posible, mantenga sus datos "incrustados" y no use modelos referenciados. Permite la actualización atómica de los elementos "principal" y "secundario" en actualizaciones simples en las que no necesita preocuparse por la concurrencia. Probablemente sea una de las razones por las que debería haber seleccionado MongoDB en primer lugar.