Mongoose:不能将嵌套对象保存到嵌套模型

时间:2015-03-06 17:28:26

标签: node.js mongodb mongoose

我设置了以下架构:

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]
    });

贸易方案实际上并不需要进行交易"像这样嵌套的属性,但我从anAPI得到它,现在我想保留它,就像我得到它一样。

问题是,当我采用原始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'
    }
}

......我保存了它......

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

......似乎剥离了“交易”。 key,这就是保存到db的所有内容:

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

我错过了验证步骤,质量分配问题等吗?

编辑:如果我将TradeSchema设置为只有一个Object类型,它可以保存好:

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

不确定自从我刚接触Mongo / Mongoose后我会失去什么,但似乎可能是一个缺点。

1 个答案:

答案 0 :(得分:13)

创建Trade对象之后,在将其推送到market.trades之前,请使用markModified函数,将trade路径传递给它,如下所示:

trade.markModified('trade');

这将告诉Mongoose此路径已被修改并将其保存到数据库中。这是混合模式类型所必需的。