2012-09-30 18 views
15

Ich versuche, Mongoose als ein ODM für MongoDB mit meiner Anwendung node.js zu verwenden. Ich habe bemerkt, dass wenn ich ein Schema mit einem eingebetteten Dokument entwerfe, dass wenn ich keinen Wert hinzufüge, es ein leeres Array "[]" in Mongo speichert. Warum ist das? Ich versuche, historische Änderungen in Datensätzen zu speichern, und ein leeres Array würde bedeuten, dass diese Änderung den Wert gelöscht hat. Hier ist ein Beispielschema.Warum fügt Mongoose leere Arrays hinzu?

Hier ist das resultierende Dokument, wenn ich ein Dokument mit nur Name und Subdomain speichern.

{ 
    "name": "Smith Company", 
    "products": [], 
    "subdomain": "smith" 
} 

Warum hat es Produkte standardmäßig mit einem leeren Array hinzugefügt und wie kann ich es stoppen?

+0

der Standardwert für ein Array ist ein leeres Array, wenn Sie also sparen nur {name: „foo“, Sub-Domain: „bar“} Produkte wird ein leeres Array sein. – supernova

+0

Gibt es eine Möglichkeit, den Standardwert für ein Array so zu ändern, dass nichts geschrieben wird? – wintzer

+0

können Sie den Code veröffentlichen, in dem Sie Ihr Dokument aktualisieren? – supernova

Antwort

0

Da Sie in Ihrem Schema Produkte definieren, um ein Array von Objekten zu sein. Sie müssten etwas versuchen wie:

products: { 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }, 

Dies speichert ein leeres Objekt anstelle eines Arrays.

+2

Ich möchte, dass es ein Array ist, da ein Dokument Verweise auf mehrere Produkte enthalten kann. Ich möchte nicht, dass etwas in die Datenbank geschrieben wird, wenn ich keine Daten hineinlege. – wintzer

+0

Ich denke das wird nicht einmal in die Datenbank geschrieben - hast du das überprüft? Ich hatte ein Modell ohne ein Array, und als ich gerade ein Array von Objekt-IDs und 'hinzugefügt.findOne hat eine dieser Model-Instanzen gefunden, die '.toJSON' hat die leere Liste in der Antwort hinzugefügt, obwohl ich seither nicht in die Datenbank geschrieben habe. – sol

12

Leere Array bietet Ihnen eine bequeme Möglichkeit zum Hinzufügen oder Entfernen von Elementen aus Ihrem Modell.

$push$addToSet$pull in Update würde Ihnen helfen, Ihre Array-Elemente zu verwalten.

Wenn Sie nicht eine leere Array haben, dann können Sie nicht Elemente drücken, um null

Aber es ist möglich, in leeren Array.

+10

Es gibt jedoch immer noch Fälle, in denen Sie möchten, dass das Fehlen eines Attributs für "irrelevant für dieses Dokument" steht. Wenn das eine gewöhnliche Sache ist, ist es eine hässliche Verschwendung, eine Menge leerer Arrays zu haben. Es scheint eine der Schönheiten der Dokumentendatenbanken zu besiegen, nämlich die Fähigkeit, verschiedene Dokumentenstrukturen in derselben Sammlung zu speichern. Ich würde gerne sehen, dass leere Arrays zu keinem Attribut im Dokument führen können, es sei denn, ein leeres Array ist explizit Teil des Modells, das gespeichert wird. Dies ist auch intuitiv. Das oder eine Erklärung dafür, warum das in MongoDB nicht möglich ist. – neverfox

3

Dies scheint durch Design zu sein, aber es gibt eine Abhilfe hier einen ‚pre‘ Handler mit dem Standard leeres Array zu entfernen: https://github.com/LearnBoost/mongoose/issues/1335

Dies nur für mich gearbeitet, wenn ich das Feld null gesetzt, though. Wenn ich es wie im Beispielcode auf undefined einstelle, scheint das leere Array zurück zu kommen.

3

können Sie umgehen, indem Sie das Schema definieren wie folgt:

products: { 
    type: [{ 
    name:String, 
    startDate:Date, 
    endDate:Date 
    }], 
    default: undefined 
} 
Verwandte Themen