mongoose .die find () - Methode zurückgegebene Objekt mit unerwünschten Eigenschaften
so, ich arbeite mit dem Mungo, der für einige Zeit und ich fand einige wirklich seltsame Dinge. Es wäre toll, wenn jemand könnte mich aufklären.
Die Sache ist, wenn mit dem .die find () - Methode des Mungos, das Objekt, bekomme ich als Antwort ist voll von Eigenschaften, die ich nicht wissen, Woher Es kam (ich vermute, Sie sind built-in Eigenschaften, aber egal) und ich möchte iterieren nur über die Eigenschaften ich .wählen Sie(). Got it? Nein? ok... zu erklären, besser:
Habe ich mein schema und Modell erklärt:
var mySchema = mongoose.Schema({
name: String,
prop1: String,
prop2: String,
prop3: String
})
var myModel = DB.model('myDataBase', mySchema)
Dann möchte ich finden ein Dokument mit den Namen, sagen wir, John und abrufen können alle, aber die 'name' - Feld, so gehe ich:
myModel.find({name: 'John'}, '-name', function(err, results){
log(results[0])
}
und log(results[0]) Protokolle
{ prop1: 'one',
prop2: 'two',
prop3: 'three' }
So weit, So gut. Aber das Problem ist, jetzt will ich Durchlaufen diese Eigenschaften und überprüfen Sie eins nach dem anderen, und ich weiß nicht für sicher, wie viele 'Requisiten' wird jedes Ergebnis haben, so wollte ich etwas wie:
for(var key in results[0]){
log(key)
}
So, ich hoffe, es wird log 'prop1', 'prop2' und 'prop3', aber Nein! Ok, ich bekomme Requisiten 1, 2 und 3, aber auch ich bekomme eine Menge anderer Eigenschaften und Funktionen wie: isNew, Fehler, _maxListeners, _doc, etc. Nicht nur diese extras, Eigenschaften, bekomme ich auch die 'name' - Eigenschaft, die ich von der Auswahl ausgeschlossen (und es war ausgeschlossen, wie gezeigt, in der ersten Anmeldung). Komisch, nicht wahr?
Aber warten Sie! Es gibt noch mehr! Ich habe online recherchiert und fand einige Menschen, die sagen: "Dude, bei der Iteration über Objekt-Eigenschaften verwenden Sie die hasOwnProperty-Methode!". So da ich ging:
for (var key in results[0]){
if (results[0].hasOwnProperty(key)) log(key)
}
Protokoll Ergebnis ist ein paar von Eigenschaften (spezifisch: $__, isNew, Fehler, _maxListeners, _doc, _pres, _posts, speichern, _events) und nicht enthalten keine der Requisiten, die ich wollte in den ersten Platz.
Meine Frage ist, wie kann ich Durchlaufen nur prop 1, 2 und 3, ohne diese, ich weiß nicht, built-in-Eigenschaften und die, die ich explizit ausgeschlossen in den Parametern? (ps: ich dachte an eine Lösung, die nicht beinhalten, die zum konvertieren mein Objekt in ein array, wenn das ist möglich)
Auch, keine Frage per se, sondern aus Neugier, Woher diese Eigenschaften kommen? Warum erscheinen Sie in der for-Schleife und nicht, wenn ich log das Objekt? Warum die Eigenschaft, die ich ausgeschlossen ('name') erscheint auch in der for-Schleife? Was zur Hölle ist hasOwnProperty, wenn es nicht erkennt die Eigenschaften, die wurden nur protokolliert?
Vielen Dank für Ihre Zeit und Hilfe!
Bye!
- .toObject() würde Ihnen ein schlichtes Objekt, vielleicht würde helfen? Die zusätzlichen Eigenschaften sind, weil das, was Sie zu tun haben ist eine Instanz eines Modells, die nicht einem einfachen Objekt.
- danke @Kevin B ! Habe noch eine Menge Fragen, aber dass in der Tat, ist mein problem gelöst! Posten Sie Ihren Kommentar als eine Antwort, so kann ich mark es richtig? BR!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alternativ zu Kevin B ' s Antwort, die Sie übergeben können
{lean: true}
als option:In MongoDB werden die Dokumente gespeichert werden, einfach als Objekte. Wenn Mungo ruft Sie, wirft Sie ins Mungo Dokumente. Dabei fügt er allen keys, die in Ihrem
for
Schleife. Dies ist, was können Sie das Dokument Methoden. Wenn Sie Sie nicht verwenden dieselean
ist eine gute option, wie er springt, der gesamte Prozess, die zunehmende Geschwindigkeit von Abfragen. Potenziell 3x so schnell.In diesem Fall .toObject wäre genug, um Ihre Schleife zu arbeiten, wie Sie erwarten.
Den zusätzlichen Eigenschaften, die Sie immer waren, sind ursprünglich aufgrund der Tatsache, dass
results
ist eine Sammlung von Modell-Instanzen, die mit zusätzlichen Eigenschaften und Methoden, die nicht auf normale Objekte. Diese Eigenschaften und Methoden sind das, was bis kommenden in den loop. Durch die VerwendungtoObject
bekommen Sie ein Ebene-Objekt ohne all diese zusätzlichen Eigenschaften und Methoden.JSON.parse(JSON.stringify(results))
auf jedes Ergebnis. Mit.toObject()
ist so viel sauberer und besser in jeder Hinsicht..toJSON()
- Methode ist nur ein alias von diesem.toObject()
Methode, so dass die serialisierte format enthalten nur die lean-Objekt.