2012-08-16 11 views
8

Im tratando de hacer una simple actualizaciónactualización de la colección de meteoritos con id tradicional

Collection.update(id, {$set:{name:value}}); 

o incluso

Collection.update({'_id':id}, {$set:{name:value}}); 

Pero la colección no se actualizará si el id es un identificador mongodb tradicional. Solo parece funcionar con la implementación propia de los meteoros de identificadores únicos. ¿Cómo puedo remediar esto? ¿Es posible que un meteoro acepte la propia estructura de identificación de mongo?

+0

¿Su variable 'id' es una cadena o ObjectId? Un valor de cadena como '502c7550bc3820529d81a9bd' no coincidirá con' ObjectId ("502c7550bc3820529d81a9bd") '. – Stennie

+0

Meteor no sabe qué es un 'ObjectId'' ReferenceError: ObjectId no está definido' – Akshat

+3

Hrm, parece que puede ser el caso, aunque parece extraño romper una característica predeterminada que se usaría para acceder a los datos de MongoDB existentes :(Hay un problema abierto en la cola Meteor github: [update() roto cuando se trabaja con registros preexistentes de mongodb usando ObjectId()] (https://github.com/meteor/meteor/issues/61), que parece ser el mismo problema que está tratando de resolver. Tal vez vale la pena preguntar en el [meteor-talk google group] (https://groups.google.com/forum/?fromgroups#!forum/meteor-talk) también. – Stennie

Respuesta

6

Es posible convertir su ID en un objeto mongodb (en el lado del servidor) utilizando el nuevo ObjectID y luego hacer la actualización. :

var ObjectID, require; 

require = __meteor_bootstrap__.require; 

ObjectID = require("mongodb").ObjectID; 

Meteor.methods({ 
    SomeUpdate: function(upd) { 
    var id; 
    id = new ObjectID(upd['_id']); 
    return SomeDB.update({ 
     _id: id 
    }, { 
     $set: { 
     field: value 
     } 
    }, function(res) { 
     return console.log(res); 
    }); 
    } 
}); 
+0

También es posible poner el objectid Implementación en el paquete mongodb utilizando 'new MongoDB.BSONPure.ObjectID' mientras se adjunta un' var require = __meteor_bootstrap __. require; var MongoDB = require ("mongodb"); 'y funcionaría en el lado del cliente cuando la actualización se realice en el extremo del servidor siempre que se pase el objectid como una cadena entremedio – Akshat

7

Tiene razón: el protocolo DDP de Meteor no es compatible con tipos no JSON como Mongo ObjectId. Sabemos que esto es un problema: es nuestro oldest open issue y está en our roadmap.

Si bien definitivamente hay algunas soluciones rápidas "fáciles" que resolverían este problema, preferiríamos hacer esto en el contexto de ampliar nuestro protocolo para manejar otros tipos no JSON (fechas, blobs binarios, etc.) en vez que un truco específico a corto plazo.

Cuestiones relacionadas