2014-10-08 16 views
6

ho questo piccolo schema per gli utenti:Mongoose - eliminare l'elemento dell'array documento secondario

{ 
username: String, 
contacts: Array 
} 

Così, per esempio, i contatti di qualche utente sarà simile a questa:

{ 
username: "user", 
contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}] 
} 

Ora ho bisogno di eliminare un elemento dai contatti così faccio:

model.findByIdAndUpdate(23, {'$pull': { 
       'contacts':{'id':'525.....etc'} 
       }}); 

ma non sembra funzionare, n o errori, ma esso non viene eliminato, ho appena piacerebbe tornare questo documento per l'utente:

{ 
    username: "user", 
    contacts: [{'id':ObjectId('534.....etc'), 'approved': false}] 
    } 

come raggiungere questo obiettivo?

risposta

10

L'operatore $pull esegue solo le condizioni sull'elemento di matrice su cui è in funzione. Sembra che la tua domanda potrebbe non mostrare in realtà che stai probabilmente lavorando con un valore ObjectId che mangusta crea di default per tutti i campi dell'array.

Così si potrebbe alla tua richiesta in questo modo, dopo aver importato il metodo ObjectId creazione:

model.findByIdAndUpdate(23, { 
    '$pull': { 
     'contacts':{ '_id': new ObjectId(someStringValue) } 
    } 
}); 

e di fatto si può effettivamente definire il "schema" un po 'meglio, e mangusta sarà effettivamente "autocast" la ObjectId per voi in base al "tipo" definito nello schema:

var contactSchema = new Schema({ 
    approved: Boolean 
}); 

var userSchema = new Schema({ 
    username: String, 
    contacts: [contactSchema] 
}); 

Questo permette mangusta a "seguire le regole" per le definizioni strettamente tipizzati campo. Quindi ora lo conosce che in realtà c'è un campo _id per ogni elemento dell'array di contatti e che il "tipo" di quel campo è in realtà uno ObjectId in modo che i valori "String" vengano automaticamente riutilizzati come un ObjectId vero.

+0

hi grazie, ma ora ho ottenuto questo errore: ** [MongoError: eccezione: non è possibile utilizzare la parte (contatti di contacts.id) per attraversare l'elemento ({contatti: [{id: ObjectId ('543394bb964ac60915ceba8b'), approvato: false}, {id: ObjectId ('543399f9964ac60915ceba8c'), approvato: false}]}) ** cosa potrebbe essere? ho usato la tua annotazione a punti - – sbaaaang

+0

@sbaaaang Che cosa stai facendo in realtà? Stai usando il form "dot notation" come ti è stato detto? BTW Grazie per aver mostrato chiaramente che i tuoi dati effettivi differiscono da come hai postato, il che è probabilmente parte del problema di nuovo qui. Si prega di modificare per mostrare la struttura dei dati reali. –

+0

sì usando * notazione dot * come hai detto, sì sto usando ObjectIds ma beh, questo non è il problema, credo: no? (domanda modificata) – sbaaaang

1

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