为什么Mongoose用_id替换对象中的键/值对?

时间:2015-01-22 14:27:11

标签: javascript node.js mongodb mongoose backend

我正在使用Node.js,Express.js和Mongoose创建我的第一个后端项目。我有一个用户,有一个库存对象列表[{symbol: amount}]。 当用户想要购买股票时,他们会发送带有股票,金额和动词的POST请求,在这种情况下为“买入”。在邮政中,我从请求正文中获取库存和金额,并将其添加到用户的库存清单中。

使用

的请求
{stock: 'F', amount: '2', verb: 'buy'}

应该添加

{'F': '2'}

到用户的股票。问题是当我用

创建和推送股票时
stockObject[stock] = amount;
user.stocks.push(stockObject);

user.stocks变为[{ _id: 54be8739dd63f94c0e000004 }]而不是[{'F': '2'}],但是当我制作时

stockObject={'symbol':stock, 'amount': amount}

并推动我会得到

[{'symbol': 'F', 'amount': '2', _id: 54be8739dd63f94c0e000004}]

为什么Mongoose会在第一种情况下替换我的数据,但是保留在第二种情况?

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;
            }
            user.stocks.push(stockObject);
            user.save(function(err) {
                res.json({
                    stocks: user.stocks
                });
            });

        });
    })

1 个答案:

答案 0 :(得分:3)

问题在于您尝试保存的第一个对象:

console.log(stockObject);
// { 'F': '2' }

与您为其定义的Schema不匹配:

{
    symbol: String,
    amount: Number
}

Mongoose根据Schema对其保存的对象进行规范化,当'F'期望'symbol''amount'时,删除多余属性,例如if(req.body.verb === 'buy') { stockObject.symbol = stock; stockObject.amount = amount; }

[{"F": "2"}]

要将输出设为res.json({ stocks: user.stocks.map(function (stock) { // in ES6 // return { [stock.symbol]: stock.amount }; var out = {}; out[stock.symbol] = stock.amount; return out; }); }); ,您可以在将其发送到客户端之前.map()收集:

Mixed

或者,使用{ 'F': '2' }类型,如" How do you use Mongoose without defining a schema?,"这将允许您存储var UserSchema = new Schema({ id: String, stocks: [{ type: Schema.Types.Mixed }] });

{{1}}