Tengo problemas para entender cómo actualizar la matriz de etiquetas dentro de un objeto de matrices en mongoDB.
Tengo una matriz de objetos y su ObjectID correspondiente cuyas etiquetas me gustaría actualizar en mongoDB. Lo que intenté es usar un ciclo usando updateOne especificando el ObjectID como una consulta para encontrar el Documento respectivo.
Algo como esto:
nodes.forEach(node => { const query = { '_id' : ObjectId(node.Id) } db.collection(collection).updateOne( query, { $set: { 'tags': value } }, function(err, result) { if (err) { throw err; } console.log(result); }); });Esto no funcionó desafortunadamente. He intentado otros enfoques pero no pude encontrar nada que funcione
Tengo la siguiente estructura de datos mongodb:
{ "_id": { "$oid": "6022bc9f9b55276bd39f4e0" }, "name": "TestProject", "projectData": { "nodes": [ { "data": { "_id": { "$oid": "6022bc959b559276bd39f4be" }, "nodeData": { "tags": [] } } }, { "data": { "_id": { "$oid": "7022bc959b559276bd39f4ce" }, "nodeData": { "tags": [] } } }, { "data": { "_id": { "$oid": "8022bc959b559276bd39f4de" }, "nodeData": { "tags": [] } } } .... ] }Me gustaría actualizar solo etiquetas específicas de objetos que coincidan con los que paso como ID de objeto. ¿Cuál sería el mejor enfoque para actualizar un grupo de valores de objeto que coincidan con un ObjectID específico?
Puede usar el operador posicional filtrado $[<identifier>] identifica los elementos de la matriz que coinciden con las condiciones de arrayFilters para una operación de actualización.
$in condiciones, de lo contrario, puede usar la operación bulkWrite() . let value = ["tag1", "tag2"]; let nodes = [ ObjectId("6022bc959b559276bd39f4be"), ObjectId("7022bc959b559276bd39f4ce") ]; db.collection(collection).updateOne( {}, { $set: { "projectData.nodes.$[d].data.nodeData.tags": value } }, { arrayFilters: [ { "d.data._id": { $in: nodes } } ] } )Para completar, quiero agregar mi propia solución a esto. Según la respuesta aceptada, construyo la siguiente operación, ya que cada nodo puede tener etiquetas diferentes y quería poder agregar etiquetas cada vez:
const ObjectID = require('mongodb').ObjectID; nodes.forEach(node => { updateOneObjectWithTags(db, node._id, "projectData.nodes.$[d].data.nodeData.tags", node.nodeData.tags, "d.data._id", collection).then(result => { console.log(result); }); }); updateOneObjectWithTags: (db, objectId, updateKey, updateValue, arrayFilterKey, collection) => { return new Promise((resolve, reject) => { db.collection(collection).updateOne( {}, { $set: { [updateKey] : updateValue } }, { arrayFilters: [ { [arrayFilterKey]: new ObjectID(objectId) } ] }) resolve(true); });