2012-09-27 7 views
5

Para los sake de simplicidad, suponiendo que estos son mis esquemas de recolección:Mangosta/MongoDB - Ejemplo simple de añadir a una matriz de objetos de documento, con un esquema predefinido

var MessageDeliverySchema = new Schema({ 
    from : { type : String }, 
    to  : { type : String }, 
    status : { type : String } 
}); 

var Messages = mongoose.model('messages', 
new Schema({ 
    id    : ObjectId, 
    user   : { type:String }, 
    'sent-messages' : [MessageDeliverySchema] 
})); 

Así que cada documento en la colección Los mensajes pueden tener 4/5 mensajes enviados definidos por MessageDeliverySchema.

Lo que quiero hacer es tener una serie de enviados-mensajes, por lo que cada vez que un recibo de entrega viene en acabo de actualizar mensajes y añadir otro mensaje enviado.

Lo que he intentado:

var delivered = { 
from: 'foo', 
to: 'bar', 
status: 'delivered' 
}; 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$pushAll: { 'sent-messages' : delivered }} , {upsert:true}, function(err, data) { 

}); 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 

$ pushAll y $ empuje, no añade un nuevo objeto a enviados-mensajes, sino que sobrescribe un mensaje existente.

Lo que quiero ver es una serie de mensajes que se envían por ejemplo:

{ 
    'sent-messages': [ 
     { 
      from: 'foo', 
      to: 'bar', 
      status: 'delivered' 
     }, 
     { 
      from: 'pippo', 
      to: 'pippo', 
      status: 'delivered' 
     }, 
     { 
      from: 'paul', 
      to: 'smith', 
      status: 'undelivered' 
     } 
    ] 
} 
+0

'$ push' es el operador derecho a usar y su código funcionó bien cuando lo probé . Cada vez que lo ejecuté, se agregó un nuevo elemento de matriz 'send-messages'. – JohnnyHK

+0

@JohnnyHK Ah, está bien, así que no sobrescribió el mensaje existente. Me aparece el error: 'No se puede aplicar $ push/$ pushAll modifier a non-array'. – StuR

+1

Lo que significa que la propiedad 'sent-messages' en ese documento que ya está en la base de datos no es una matriz por lo que no se puede insertar. Tal vez hayas agregado ese documento a través de otros medios, por lo que no coincide con tu esquema de Mongoose. – JohnnyHK

Respuesta

9

El error que estaba recibiendo era: 'No se puede aplicar $ push/$ pushAll modificador no es un array'.

que añade un objeto al documento de la siguiente manera:

Message.update({_id: '5064aae4154cb34d14000001' }, 
      { 'sent-messages' : delivered }, function(err, data) { 
    }); 

y luego trató de hacer un $ de empuje, lo que me dio el error anterior.

Así que eliminé el documento y usé $ push que tuvo el efecto deseado.

de referencia, esta es la forma correcta de agregar a un documento existente, y la respuesta a mi pregunta: ¿

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 
Cuestiones relacionadas