为啥 Mongoose 用 _id 替换对象中的键/值对?
Posted
技术标签:
【中文标题】为啥 Mongoose 用 _id 替换对象中的键/值对?【英文标题】:Why is Mongoose replacing key/value pair in an object with _id?为什么 Mongoose 用 _id 替换对象中的键/值对? 【发布时间】:2015-03-21 09:14:58 【问题描述】:我正在使用 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】:问题是您尝试保存的第一个对象:
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
]
);
【讨论】:
啊,有道理。那么有没有办法在模式中指定键/值对,或者我应该通过猫鼬 _id 单独跟踪每只股票而不是尝试执行 user.stocks[stockSymbol]?以上是关于为啥 Mongoose 用 _id 替换对象中的键/值对?的主要内容,如果未能解决你的问题,请参考以下文章