为什么Mongoose用_idreplace对象中的键/值对?

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

一个请求

 {stock: 'F', amount: '2', verb: 'buy'} 

应该加上

 {'F': '2'} 

到用户的股票。 问题是当我创build和推动股票

 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会在第一种情况下replace我的数据,但保留在第二种情况下?

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

问题是你要保存的第一个对象:

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

与您为其定义的Schema不符:

 { symbol: String, amount: Number } 

mongoose根据Schema对它保存的对象进行归一化处理,当期望只有'symbol''amount'时,去除多余的属性,比如'F' 'amount'

 if(req.body.verb === 'buy') { stockObject.symbol = stock; stockObject.amount = amount; } 

要获得输出为[{"F": "2"}] ,您可以在收集之前将.map()集合发送给客户端:

 res.json({ stocks: user.stocks.map(function (stock) { // in ES6 // return { [stock.symbol]: stock.amount }; var out = {}; out[stock.symbol] = stock.amount; return out; }); }); 

或者,使用Mixedtypes,如“ 如何使用Mongoose而不定义模式? ”中提到的,这将允许您存储{ 'F': '2' }

 var UserSchema = new Schema({ id: String, stocks: [{ type: Schema.Types.Mixed }] });