为啥 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 替换对象中的键/值对?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 autorest 用 Swagger 中的对象替换我的自定义结构?

Mongoose - 如何替换 _id 作为主索引?

更新对象数组中的元素在 Mongoose 中不起作用

在 Mongoose 中插入新的重复记录时替换旧记录

Mongoose Populate() 用对象替换数组

为啥使用 MongoDB 的 $push 将新对象添加到数组时添加了带有 ObjectID 的 _id?