Estoy tratando de aprender a usar consultas mongo para llegar a lo más profundo de un árbol de datos. Específicamente, estoy tratando de eliminar el objeto debajo de {"object": 'to remove'}
{ "_id" : ObjectId("7840f22736341b09154f7ebf"), "username" : "nmay", "fname" : "Nate", "lname" : "May", "data" : [ { "monthNum" : 1, "year" : 2016, "days" : [ { "date" : "2016-01-01T06:00:00.000Z", "type1" : [], "type2" : [] }, { "date" : "2016-01-02T06:00:00.000Z", "type1" : [ {"object": 'to remove'} ], "type2" : [] } ] } ] }
hasta ahora sé cómo consultar el _id
del usuario, pero no estoy seguro de cómo eliminar el objeto deseado usando los índices en cada matriz. En este ejemplo, quiero eliminar data[0].days[1].type1[0]
Aquí está la consulta que tengo hasta ahora:
app.delete('/user/:id/data/:monthIndex/days/:dayIndex/type1/:type1Index', function (req, res, next) { var monthIndex = parseInt(req.params.monthIndex); // these console the value properly var dayIndex = parseInt(req.params.dayIndex); // -1 is applied to the parameter to translate to array position var type1Index = parseInt(req.params.type1Index); db.users.update( { _id: mongojs.ObjectId(req.params.id) }, { $pull: data.monthIndex.days.dayIndex.type1.type1Index } ); }
me da el error
ReferenceError: los datos no están definidos
¿Alguien puede demostrar cómo puedo pasar esta consulta a mis parámetros de índice para eliminar el objeto deseado?
Desafortunadamente, no hay forma de eliminar un elemento de matriz por su índice numérico con una sola operación en MongoDB. Para hacer esto, primero debe desactivar los elementos deseados y luego eliminar los campos resultantes con valores null
.
Su código debería ser algo como esto:
db.users.update( { _id : mongojs.ObjectId(req.params.id) }, { $unset : { 'data.0.days.1.type1.0' : 1 } } ); db.users.update( { _id : mongojs.ObjectId(req.params.id) }, { $pull : { 'data.0.days.1.type1' : null } } );
Editar por @bob: para pasar los parámetros, debe crear la cadena de consulta, que es fea:
var unset = {}; unset['$unset'] = {}; unset.$unset['data.' + req.params.monthIndex + '.days.' + req.params.dayIndex + '.foods.' + req.params.foodIndex] = 1; db.users.update( { _id : mongojs.ObjectId(req.params.id) }, unset ); var pull = {}; pull['$pull'] = {}; pull.$pull['data.' + req.params.monthIndex + '.days.' + req.params.dayIndex + '.foods'] = null; db.users.update( { _id : mongojs.ObjectId(req.params.id) }, pull );