Mungo: CastError: Cast zu ObjectId fehlgeschlagen für Wert "[Objekt Objekt]" im Pfad "_id"
Ich bin neu node.js so habe ich das Gefühl, dass es etwas albern, dass ich das übersehen habe, aber ich habe nicht in der Lage, eine Antwort zu finden, behebt mein problem. Was ich versuche zu tun ist, erstellen Sie einen Pfad, erstellen Sie ein neues child-Objekt, fügen Sie die übergeordnete Reihe von Kindern, dann wieder das Kind-Objekt an den Antragsteller. Das problem, das ich laufen in ist, dass wenn ich übergeben Sie die string-id in findById, Knoten stürzt ab mit
TypeError: Object {} hat keine Methode "cast"
Wenn ich versuche, Sie zu übergeben in einem ObjectId-stattdessen bekomme ich
CastError: Cast ObjectId fehlgeschlagen für den Wert "[object object]" path "_id"
Hier ist eine grobe Skizze von meinem code:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server:port/database');
app.get('/myClass/:Id/childClass/create', function(request, result) {
var id = new ObjectId(request.params.Id);
MyClass.findById(id).exec( function(err, myClass) {
if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
var child = ChildClass();
myClass.Children.addToSet(child);
myClass.save();
result.send(child);
});
});
Wenn ich diesen code ausführen mit dem Pfad "/myClass/51c35e5ced18cb901d000001/childClass/erstellen", dies ist die Ausgabe des Codes:
Fehler: CastError: Cast ObjectId fehlgeschlagen für den Wert "[object object]" path "_id"
{"path":"51c35e5ced18cb901d000001","instance":"ObjectID","validators":[],"setters":[],"getters":[],"_index":null}
Ich habe versucht, mit findOne und übergeben {_id:id} anstelle, aber das scheint genau das, was findById tut. Ich habe versucht, die verschiedenen Klassen, die für die ObjectId, die ich gesehen habe auf anderen Seiten aufgelistet. Ich habe versucht, Sie anzurufen, ObjectId() wie eine Funktion anstelle von einem Konstruktor auf und gibt Sie undefined zurück. An diesem Punkt, ich bin mir langsam die Ideen aus und es scheint nicht, dass Sie googeln für eine Antwort ist zu helfen. Irgendwelche Ideen auf, was ich falsch mache?
Auch, wie ich schon sagte, ich bin der neue Knoten/Mongo/Mungo/Express, so dass, wenn es einen besseren Weg gibt, um zu erreichen mein Ziel, lassen Sie es mich bitte wissen. Ich freue mich über feedback.
EDIT:
Nach dem workaround von Peter Lyons, googelte ich eine andere Fehlermeldung, die ich lief hinein und fand findByIdAndUpdate, die wie erwartet funktioniert und tut genau das, was ich hoffte, zu tun. Ich bin mir immer noch nicht sicher, warum findById und findOne Gaben mir solche Fragen, und ich bin neugierig, zu wissen, (vielleicht ein bug-report muss eingereicht werden), so lasse ich das offen für den Fall jemand hat eine Antwort.
InformationsquelleAutor der Frage jmblackmer | 2013-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: verwenden Sie Mungo.Typen.ObjectId.
Mungo (aber nicht "mongo") annehmen können Objekt-Ids als String und "cast" richtig für Sie ist, so einfach:
Jedoch die Einschränkung ist, wenn
req.params.id
ist nicht ein gültiges format für ein mongo ID-string, wird eine exception werfen, die Sie fangen müssen.So die wichtigsten verwirrend, was zu verstehen ist, dass
mongoose.SchemaTypes
hat Sachen, die Sie nur verwenden, wenn die Definition Mungo-schemas undmongoose.Types
hat die Sachen, die Sie verwenden, wenn Sie Daten von Objekten, die Sie speichern möchten, in der Datenbank oder Abfrage von Objekten. Somongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
funktioniert, wird Ihnen ein Objekt, können Sie Sie speichern in der Datenbank oder in Abfragen verwenden, und eine Ausnahme werfen, wenn gegeben, eine ungültige ID-string.findOne
dauert ein query-Objekt und übergibt eine single-Modell-Instanz der callback. UndfindById
ist buchstäblich ein wrapperfindOne({_id: id})
(siehe source-code hier). Nurfind
dauert ein query-Objekt und übergibt ein array von matching-Modell Instanzen, die an den callback.Nur langsam gehen. Es ist verwirrend, aber ich kann Ihnen garantieren, Sie werden immer verwechselt und nicht schlagen Fehler in Mungo an dieser Stelle. Es ist eine ziemlich ausgereifte Bibliothek, aber es dauert einige Zeit, um den Dreh raus.
Die anderen vermuten, was ich sehe, in deinem snippet ist nicht mit
new
beim instanziierenChildClass
. Darüber hinaus müssen Sie Ihre post-schema-code, um für uns, Ihnen zu helfen-Trakt nach unten CastErrors bleiben.InformationsquelleAutor der Antwort Peter Lyons
Habe ich angesichts dieser Fehler, weil der Wert, den Sie filtern möchten, in das _id Feld ist nicht in einer ID format, ein "wenn" sollte dieses Problem lösen.
Zu lösen, immer zu prüfen, ob die Kriterien Wert für die Suche ist eine gültige ObjectId
InformationsquelleAutor der Antwort gsalgadotoledo
Für all diese Menschen stecken mit diesem problem, aber noch konnte es nicht lösen: ich stolperte über den gleichen Fehler gefunden und das
_id
Feld leer.Ich es beschrieben hier im detail. Habe noch keine Lösung gefunden, außer das ändern der Felder in
_id
zu nicht-ID-Felder, das ist ein dirty hack für mich. Werde ich wahrscheinlich einen bug-report für mongoose. Jede mögliche Hilfe würde geschätzt!Edit: habe meinen thread aktualisiert. Ich habe ein ticket eingereicht und bestätigt die fehlende
_id
problem. Es wird behoben werden in den 4.x.x-version, die hat ein release-Kandidat jetzt. Die rc ist nicht empfohlen für den produktiven Einsatz!InformationsquelleAutor der Antwort Stefan Medack
Wenn Sie mit diesem Problem, und Sie führen ein Auffüllen irgendwo entlang der Linien, sehen Sie diese Mungo-Problem.
Update zu Mungo 4.0 und das Problem wurde behoben.
InformationsquelleAutor der Antwort ac360
Hatte das gleiche problem, dass ich nur gezwungen, die id in einen string.
Mein schema:
Und dann beim einsetzen:
InformationsquelleAutor der Antwort camstuart
War ich diese Fehlermeldung CastError: Cast ObjectId fehlgeschlagen für den Wert "[object object]" path "_id" nach dem erstellen eines Schemas, dann ändern Sie es und konnte nicht verfolgen Sie unten. Ich löschte alle Dokumente in der Sammlung und ich könnte hinzufügen, 1 Objekt, aber nicht eine Sekunde. Ich landete das löschen der Sammlung in Mongo und arbeitete als Mungo neu die Sammlung.
InformationsquelleAutor der Antwort Enkode
Fürs Protokoll: ich hatte diesen Fehler versuchen, füllen Sie ein Filialdokument in einen falschen Weg:
schauen ^ - Wert ist ein array, ein Objekt: falsch!
Erklärung: ich war das senden der Daten von php an eine node.js API:
Wie Sie sehen können, $die Geschichte ist ein array, ein array. Das ist, warum Mungo zu füllen versuchen _id (oder einem anderen Feld) mit einem array statt als ein Schema.ObjectId (oder einem anderen Datentyp). Die folgenden Werke:
InformationsquelleAutor der Antwort Igor Parra
Ich hatte das gleiche problem.Stellt sich heraus, meine Node.js veraltet war. Nach Upgrade funktioniert es.
InformationsquelleAutor der Antwort Rajesh Barik
Ich auch festgestellt Mungo Fehler CastError: Cast ObjectId nicht für Wert \"583fe2c488cf652d4c6b45d1\" im Pfad
\"_id\" for model User
So, ich führe npm list-Befehl, um zu überprüfen, die mongodb-und mongoose-version in meinem lokalen.
Hier ist der Bericht:
......
......
├── [email protected]
├── [email protected]
.....
Es scheint, gibt es ein Problem, auf das mongodb-version, so habe ich deinstallieren und versuchen Sie eine andere version wie 2.2.16
$ npm uninstall mongodb
löschen der mongodb von Ihrem node_modules-Verzeichnis. Danach installieren Sie die untere version von mongodb.$ npm install [email protected]
Schließlich habe ich die app starten und die CastError Weg!!!!
InformationsquelleAutor der Antwort Arman Ortega