2015-03-06 9 views
8

Mam następujący schemat skonfigurować:Mongoose: nie można zapisać zagnieżdżonego obiektu do zagnieżdżonego modelu

var TradeSchema = new mongoose.Schema({ 
     channel: String, 
     trade: { 
      tradeid: Number, 
      timestamp: Date, 
      datetime: Date, 
      marketid: Number, 
      marketname: String, 
      quantity: Number, 
      price: Number, 
      total: Number, 
      type: String 
     } 
    }); 

var MarketSchema = new mongoose.Schema({ 
     name: { type: String, index: true }, 
     trades: [TradeSchema] 
    }); 

Schemat Trade faktycznie nie muszą mieć „handlową” własność zagnieżdżone tak, ale ja dostaję to od anAPI i na razie chcę zachować to dokładnie tak, jak to mam.

Problem jest, gdy biorę surowego obiektu JS:

{ 
    channel: 'trade.5', 
    trade: { 
     tradeid: '86554823', 
     timestamp: 1425569593, 
     datetime: '2015-03-05 10:33:13 EDT', 
     marketid: '5', 
     marketname: 'FTC/BTC', 
     quantity: '957.65001732', 
     price: '0.00001210', 
     total: '0.01158757', 
     type: 'Sell' 
    } 
} 

... i zapisać go ...

market.trades.push(trade); 
market.save(function(err){ 
    if (err) console.log('Error saving trade to market.'); 
}); 

... Wydaje się rozebrać się z ' klucz handlu”, a to wszystko, co zostanie zapisane w db:

{ channel: 'trade.5', _id: 54f9e3056e23df1ee3e60327 } 

jestem brakuje etapie walidacji problemu masowego przypisania, etc?

EDIT: Jeżeli ustawić TradeSchema po prostu mieć typ obiektu, zapisuje w porządku:

var TradeSchema = new mongoose.Schema({ 
     channel: String, 
     trade: Object 
    }); 

Nie wiem, co bym stracić, ponieważ jestem nowy w Mongo/Mangusta, ale wydaje się, że istnieje prawdopodobnie wadą.

Odpowiedz

12

Po utworzeniu obiektu Trade i przed popychając go do market.trades, użyj funkcji markModified, przechodząc ścieżkę trade do niego tak:

trade.markModified('trade'); 

to powie Mongoose, że ta ścieżka została zmodyfikowana i zapisać go do DB. Jest to wymagane w przypadku mieszanych typów schematów.

+0

To się udało! Dziękuję Ci. – crypticsymbols

+0

Możesz także użyć go w ten sposób, jeśli masz już model z jakimś zmienionym i zagnieżdżonym obiektem: 'market.trades.push (trade); market.markModified ("transakcje"); market.save(); 'To działa dla mnie jak urok! Ty. – SkyDancer