2012-08-16 7 views
8

Im Versuch, ein einfaches UpdateMeteor Sammlung Update mit traditionellen id

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

oder sogar aktualisieren

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

Aber die Sammlung nicht zu tun, wenn die id eine traditionelle mongodb-ID ist. Es scheint nur mit der eigenen Implementierung von einzigartigen IDs zu funktionieren. Wie kann ich das beheben? Ist es möglich, dass der Meteor die eigene ID-Struktur von Mongo akzeptiert?

+0

Ist Ihre ID-Variable eine Zeichenfolge oder ObjectId? Ein String-Wert wie '502c7550bc3820529d81a9bd' stimmt nicht mit' ObjectId ("502c7550bc3820529d81a9bd") 'überein. – Stennie

+0

Meteor weiß nicht, was eine 'ObjectId' ist' ReferenceError: ObjectId ist nicht definiert' – Akshat

+3

Hrm, scheint das der Fall zu sein, obwohl es merkwürdig erscheint, ein Standardmerkmal zu brechen, das für den Zugriff auf existierende MongoDB Daten verwendet wird :(Es gibt ein offenes Problem in der Meteor-github-Warteschlange: [update() wurde beim Arbeiten mit bereits vorhandenen mongodb-Datensätzen mit ObjectId()] (https://github.com/meteor/meteor/issues/61), das gleich aussieht, unterbrochen Problem, das Sie zu lösen versuchen Vielleicht ist es auch wert, auf der [meteor-talk google group] (https://groups.google.com/forum/?fromgroups#!forum/meteor-Talk) zu fragen. – Stennie

Antwort

6

Es ist möglich, Ihre ID in ein Mongodb-Objekt (auf der Serverseite) zu konvertieren, indem Sie eine neue ObjectID verwenden und dann das Update durchführen. :

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

Es ist auch möglich, die ObjectID zu setzen Implementierung in das mongodb-Paket unter Verwendung von 'new MongoDB.BSONPure.ObjectID', während ein' var require = __meteor_bootstrap __. require; 012 angehängt wirdvar MongoDB = require ("mongodb"); 'und es würde auf der Client-Seite funktionieren, wenn die Aktualisierung auf dem Server-Ende der Dinge erfolgt, solange die ObjectID als String dazwischen übergeben wird – Akshat

7

Sie haben recht: Meteors DDP-Protokoll unterstützt keine Nicht-JSON-Typen wie Mongo ObjectId. Wir wissen, dass dies ein Problem ist: es ist unser oldest open issue und es ist auf our roadmap.

Während es einige "einfache" Schnellkorrekturen gibt, die dieses Problem lösen könnten, würden wir dies lieber im Zusammenhang mit der Erweiterung unseres Protokolls tun, um andere Nicht-JSON-Typen (Datumsangaben, binäre Blobs usw.) zu behandeln als ein spezifischer Kurzzeit-Hack.

Verwandte Themen