为什么 Mongoose 用 _id 替换对象中的 key/value 对?
Why is Mongoose replacing key/value pair in an object with _id?
我正在使用 Node.js、Express.js 和 Mongoose 创建我的第一个后端项目。我有一个用户,有一个股票对象列表 [{symbol: amount}]
。
当用户想要购买股票时,他们会发送 POST 请求,其中包含股票、金额和动词,在本例中为 'buy'。在 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
});
});
});
})
问题是您要保存的第一个对象:
console.log(stockObject);
// { 'F': '2' }
与您为其定义的 Schema
不匹配:
{
symbol: String,
amount: Number
}
Mongoose 根据 Schema
规范化它保存的对象,当它只期望 'symbol'
和 'amount'
.
时删除多余的属性,如 'F'
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;
});
});
或者,使用 Mixed
类型,如“How do you use Mongoose without defining a schema?”中所述,这将允许您存储 { 'F': '2' }
.
var UserSchema = new Schema({
id: String,
stocks: [{
type: Schema.Types.Mixed
}]
});
我正在使用 Node.js、Express.js 和 Mongoose 创建我的第一个后端项目。我有一个用户,有一个股票对象列表 [{symbol: amount}]
。
当用户想要购买股票时,他们会发送 POST 请求,其中包含股票、金额和动词,在本例中为 'buy'。在 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
});
});
});
})
问题是您要保存的第一个对象:
console.log(stockObject);
// { 'F': '2' }
与您为其定义的 Schema
不匹配:
{
symbol: String,
amount: Number
}
Mongoose 根据 Schema
规范化它保存的对象,当它只期望 'symbol'
和 'amount'
.
'F'
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;
});
});
或者,使用 Mixed
类型,如“How do you use Mongoose without defining a schema?”中所述,这将允许您存储 { 'F': '2' }
.
var UserSchema = new Schema({
id: String,
stocks: [{
type: Schema.Types.Mixed
}]
});