2012-09-30 15 views
15

Próbuję zacząć używać Mongoose jako ODM dla MongoDB z moją aplikacją node.js. Zauważyłem, że kiedy projektuję schemat z osadzonym dokumentem, jeśli nie dodaję do niego wartości, to przechowuję pustą tablicę "[]" w Mongo. Dlaczego to? Próbuję zapisać zmiany historyczne w rekordach, a pusta tablica oznacza, że ​​ta zmiana usunęła wartość. Oto przykładowy schemat.Dlaczego Mongoose dodaje puste tablice?

schema.Client = new mongoose.Schema({ 
    name:{type:String, required:true}, 
    products:[{ 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }], 
    subdomain:{type:String, index:{unique:true}}, 
}) 

Oto dokument wynikowy, gdy zapisuję dokument z samą nazwą i subdomeną.

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

Dlaczego dodałem produkty z pustą tablicą domyślnie i jak mogę to zatrzymać?

+0

wartość domyślna dla tablicy jest pusta tablica, więc jeśli zapisać tylko {nazwa: „foo”, subdomeny: „bar”} produkcie będzie pustą tablicą. – supernova

+0

Czy istnieje sposób na zmianę domyślnej wartości tablicy, aby nie zapisywała niczego? – wintzer

+0

Czy możesz opublikować kod, w którym aktualizujesz swój dokument? – supernova

Odpowiedz

0

Ponieważ w swoim schemacie definiujesz produkty jako tablicę obiektów. Będziesz musiał wypróbować coś takiego:

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

Spowoduje to zapisanie pustego obiektu zamiast tablicy.

+2

Chcę, aby była to tablica, ponieważ jeden dokument może zawierać odniesienia do wielu produktów. Nie chcę, aby cokolwiek zapisywać w bazie danych, jeśli nie umieszczę w niej żadnych danych. – wintzer

+0

Myślę, że to nie jest nawet zapisane w bazie danych - czy sprawdziłeś? Posiadałem model bez tablicy, a kiedy właśnie dodałem tablicę identyfikatorów obiektów i '.findOne "dała jedną z tych instancji modelowych, że' .toJSON' dodał pustą listę w odpowiedzi, mimo że nie zapisałem w bazie danych od tego czasu. – sol

12

Pusta tablica umożliwia wygodny sposób dodawania lub usuwania elementów z modelu.

$push$addToSet$pull w aktualizacji pomoże Ci zarządzać elementami tablicy.

Jeśli nie masz pustą tablicę to nie może wypchnąć elementy null

Ale jest to możliwe w pustej tablicy.

+10

Istnieją jednak przypadki, w których chciałbyś, aby brak atrybutu oznaczał "nieistotny dla tego dokumentu". Kiedy jest to powszechna rzecz, brzydkie marnowanie ma mnóstwo pustych tablic. Wydaje się, że pokonuje ona jedną z najpiękniejszych baz danych dokumentów, a mianowicie możliwość przechowywania różnych struktur dokumentów w tym samym zbiorze. Chciałbym, aby zdolność pustych tablic nie powodowała żadnego atrybutu w dokumencie, chyba że pusta tablica jest jawnie częścią zapisywanego modelu. Jest to również intuicyjne. To lub wyjaśnienie, dlaczego nie jest to możliwe w MongoDB. – neverfox

3

To wydaje się być zgodne z projektem, ale istnieje obejście tutaj używając „pre” obsługi usunąć domyślną pustą tablicę: https://github.com/LearnBoost/mongoose/issues/1335

To działało tylko dla mnie, kiedy ustawić pole do null, choć. Jeśli ustawię go na undefined, tak jak w przykładowym kodzie, pusta tablica wydaje się wracać.

3

można obejść poprzez zdefiniowanie schematu jak poniżej:

products: { 
    type: [{ 
    name:String, 
    startDate:Date, 
    endDate:Date 
    }], 
    default: undefined 
} 
Powiązane problemy