【问题标题】:Why is a Mongo Id pushed to array instead of an Object?为什么将 Mongo Id 推送到数组而不是对象?
【发布时间】:2015-03-19 00:59:32
【问题描述】:

我正在使用 Node.js 创建我的第一个后端项目。我正在使用 Express 4 和 Mongoose 构建一个股票交易应用程序。用户有一个股票对象列表{symbol: amount}。当用户想要购买股票时,他们会发送一个 POST 请求,其中包含股票、金额和动词(在这种情况下为“购买”)。在文中, 我从请求正文中获取库存和数量并将其添加到用户的库存列表中,并将数据添加到操作列表中。我使用{stock: 'F', amount: '2', verb: 'buy'} 发布请求,因此生成的股票列表应该是stocks:[{'F': '2'}]

actions: [{"time": "2015-01-20T19:07:15.000Z",
            "verb": "buy",
            "amount": 2,
            "stock": "P",}]

当我这样做时,user.stocks.push(stockObject); user.stocks 变为 [{ _id: 54be8739dd63f94c0e000004 }] 而不是 [{'F': '2'}] 并且操作列表变为 “行动”:[ { "时间": "2015-01-20T19:07:15.000Z", “动词”:“购买”, “金额”:2, “股票”:“P”, “_id”:“54bea763589e571f0f000004” }] 添加了 _id 。 当操作列表获取具有 id 的完整对象时,为什么股票列表仅获取具有 id 的对象?

var UserSchema   = new Schema({
    id: String,        
    stocks: [{
        symbol: String,
        amount: Number
    }]
});

router.route('/user/:user_id/action')
.post(function(req, res) {
    User.findOne({           
        id: req.params.user_id
    }, function(err, user) {
        if (err) res.send(err);
        var stock = req.body.stock;
        var amount = req.body.amount;
        var stockObject = {};
        if(req.body.verb === 'buy') {
            stockObject[stock] = amount;
        } 
        var action = {
            time: Date(),
            verb: req.body.verb,
            amount: req.body.amount,
            stock: req.body.stock
        }
        user.stocks.push(stockObject);
        user.actions.push(action);                                  
        user.save(function(err) {                                   
            if (err)
                res.send(err);
            res.json({ actions: user.actions, stocks: user.stocks });                                      
        });

    });
})

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    当您在mongoose 中引用另一个模型内的对象时,它只保留被引用对象的id

    如果要检索引用的对象属性,则必须使用populate method

    【讨论】:

    • 这是否意味着任何时候我想访问用户的股票清单需要User.findOne({ id: user_id}).populate('stocks').exec(err, user)跨度>
    • 这是一个选项。但是您也可以在User 架构中定义static 方法,比如说findById,您可以使用populate 选项调用findOne。然后,每次调用该方法时,都会填充嵌套对象列表。
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2020-08-10
    • 2019-03-28
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多