【问题标题】:Mongoose: Can't save nested object to nested model猫鼬:无法将嵌套对象保存到嵌套模型
【发布时间】:2015-03-07 02:23:56
【问题描述】:

我设置了以下架构:

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

Trade 架构实际上并不需要像这样嵌套“trade”属性,但我是从 API 中获取它的,现在我想保持原样。

问题是,当我获取原始 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.');
});

...它似乎去掉了“交易”键,这就是保存到数据库中的所有内容:

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

我是否缺少验证步骤、批量分配问题等?

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

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

不知道我会失去什么,因为我是 Mongo/Mongoose 的新手,但似乎有一个缺点。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

    trade.markModified('trade');
    

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

    【讨论】:

    • 做到了!谢谢。
    • 你也可以像这样使用它,如果你已经有了带有一些改变和嵌套对象的模型:market.trades.push(trade); market.markModified('trades'); market.save();它对我来说就像一个魅力!泰。
    猜你喜欢
    • 2014-07-26
    • 2014-02-10
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2017-06-12
    • 2017-01-28
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多