2012-02-10 9 views
5

Duplicar posible:
Why can’t you modify the data returned by a Mongoose Query (ex: findById)mangosta Modificación de objeto de resultado literal no funciona

En primer lugar estoy haciendo la consulta a MongoDB, obtener todos los resultados correctos, pero sólo la pequeña modificación al objeto literal no funciona. Lo que intento hacer es agregar un nuevo campo a los comentarios. Traté de usar el método DBref pero no funcionó, así que hago 2 consultas ahora.

var query = Rss.findOne({ _id: itemId}); 
query.exec(function(err, feed) { 
    if (!err && feed.comments) { 
    console.log(feed.comments.length); 
    for (var index in feed.comments) { 
     var author = feed.comments[index].author; 
     if (author !== undefined) { 
     User.findById(author, function(err, user) { 

      /**Problem is here **/ 
      feed.comments[index].name = 'Some random field'; 
      console.log('Added new field' + util.inspect(feed)); 

     }); 
     } 

    } 
    } 
}); 

También la respuesta es esta sin el campo .name que falta.

Added new field{ _id: 4f34f343c7b0434217000012, 
    original_link: 'http://com', 
    publish_date: Fri, 10 Feb 2012 10:36:00 GMT, 
    summary: 'some text', 
    title: 'title exampel', 
    comments: 
    [ { body: 'well', 
     author: 4f30265e6f60dc061d000002, 
     _id: 4f34f3b6f96c58541700000f, 
     create_date: Fri, 10 Feb 2012 10:38:46 GMT } ], 
    create_date: Fri, 10 Feb 2012 10:36:51 GMT } 

// EDITAR más información

Pues no he encontrado la respuesta, pero de alguna forma la console.log (feed.comments [índice]) devuelve referencia a la función. Tal vez alguien que tenga más experiencia con mongoosejs podría explicar lo que sería la solución en esta situación.

{ [Function] author: 'Some random field' } 
+0

No sé si devolverá una función, pero su 'índice' no está haciendo lo que desea. No debe recorrer las matrices con 'for..in'. Use un bucle 'for' apropiado con un rango. Además 'findById' es asíncrono y nunca se está capturando, el índice es un nuevo ámbito, por lo que siempre utilizará el último índice cuando se establezca el nombre. – loganfsmyth

+0

sí, esto es cierto, ¿cuál sería la mejor manera de resolver el último problema? –

+1

Debería capturar el índice de matriz en un nuevo ámbito. Por lo general, debe envolver los contenidos de la apariencia con '(función (índice) {...}) (índice);'. Eso crea e inmediatamente ejecuta una nueva función, por lo que el valor del índice dentro de la función se captura en un cierre con la devolución de llamada de findOne. – loganfsmyth

Respuesta

10

Debes comentar a Mongoose para convertirlo en un auténtico objeto. Antes de modificar el objeto de alimentación simplemente llame a:

feed = feed.toObject(); 

Y luego puede agregar todas las propiedades adicionales que desee.

+0

¡Gracias! ¡Me tomó horas encontrar esto! Ahora que sé lo que estaba buscando, aquí hay un enlace a los documentos de la API: http://mongoosejs.com/docs/api.html#document_Document-toObject – Pascal

Cuestiones relacionadas