2013-09-01 15 views
5

Sto tentando di rimuovere un elemento da una raccolta che è memorizzata in un documento di mangusta. Il documento si presenta così:Rimuovere il documento secondario da Mongo con mangusta

{ 
    "__v": 3, 
    "_id": "5221040475f174d59a000005", 
    "items": [ 
    { 
     "sku": 1321654654613213, 
     "name": "goldfish", 
     "quantity": 12, 
     "_id": "52224ed5bd9d340000000003" 
    }, 
    { 
     "sku": 12, 
     "name": "goldfish", 
     "quantity": 13, 
     "_id": "52225dcbf2f1e40000000003" 
    }, 
    { 
     "sku": 1299, 
     "name": "goldfish", 
     "quantity": 13, 
     "_id": "522260b6f2f1e40000000004" 
    } 
    ] 
} 

voglio togliere il pesce rosso con lo SKU di 12. Io sto facendo il seguente:

var inventory = res.locals.content; 
inventory.items.remove({sku: req.params.itemSku}, function (err, item) { 
    if (err) { 
    console.log('error occurred', err); 
    res.send('error'); 
    } 
    else { 
    res.send('Item found and deleted'); 
    return; 
    } 
}); 

quando faccio questo, ottengo l'errore "TypeError: Impossibile leggere la proprietà "uguale a" non definita ". Non capisco perché.

+0

La parola "uguale" non si verifica nel codice fornito. Puoi fornire una traccia dello stack, forse? –

risposta

10

Si desidera inventory.items.pull(req.params.itemSku), seguito da una chiamata inventory.save. .remove è per documenti di livello superiore

+0

Non ricevo errori quando utilizzo 'inventory.items.pull ({sku: req.params.itemSku});' ma restituisce l'intero array invece dell'elemento con lo sku corrispondente. Perché? – Brandon

+3

'pull' restituisce' this', probabilmente per la chainability in modo da poter eseguire 'inventory.items.pull (blah) .push (blah)'. https://github.com/LearnBoost/mongoose/blob/c328227a21004c7c1a295d215bbe55801e29c9ea/lib/types/array.js#L470 –

26

I sottodocumenti dispongono ora della funzione remove. Utilizzare come segue dalle specifiche:

var doc = parent.children.id(id).remove(); 
parent.save(function (err) { 
    if (err) return handleError(err); 
    console.log('the sub-doc was removed') 
}); 
+0

È una chiamata atomica? – FRD

+2

L'hai copiato direttamente dai documenti poco brillanti di mangusta – OllyBarca

+0

In realtà, il vero salvataggio è atomico, ho guardato il codice sorgente e sembra che 'remove()' usi 'MongooseArray.pull' che, secondo i documenti v4:' Estrae gli elementi dal array atomically'. - nel caso in cui ti preoccupi che gli indici di array non siano sincronizzati. Detto questo, potresti anche usare 'MongooseArray.pull' per fare la stessa cosa, proprio come afferma la risposta accettata. – Joao

3

finaly!

MongoDB: 

"imgs" : {"other" : [ { 
     "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg", 
     "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg", 
     "_id" : ObjectId("58433bdcf75adf27cb1e8608") 
            } 
          ] 
        }, 
router.get('/obj/:id', function(req, res) { 
var id = req.params.id; 



Model.findOne({'imgs.other._id': id}, function (err, result) { 
     result.imgs.other.id(id).remove(); 
     result.save();    
    }); 
Problemi correlati