我在Mongoose中创建了一个模型:
var userWalletSchema = new Schema({
userid: {type: Schema.ObjectId, ref: 'users'},
Transactions: [{
Datum: {Type: Date},
CODE: {Type: String},
aantal: {Type: Number},
soortTransactie: {Type: String},
bedrag: {Type:Number}
}]
},
{collection:'userWallet'});
我插入以下文件:
var newRecord = { Datum: '2017-12-21T00:00:00+01:00',
CODE: 'IE00B3VWN518',
aantal: 48,
soortTransactie: 'Aankoop',
bedrag: 478 };
使用此代码:
UserWallet.findOneAndUpdate(
{ userid: mongoose.Types.ObjectId(req.user.id)},
{ $push: {Transactions: newRecord}},
{ upsert: false },
function (err, model) {
console.log(err);
console.log(model);
});
我已经尝试了几种排列和选项,但都给出了相同的结果:一条记录被推送到Transactions数组,但它总是包含值_id:ObjectId(' 5a490c3376dfb6630464f6e1')( ID当然是改变了),但从来没有打算插入的文件。
这里出了什么问题?我希望插入一个新的子文档很容易。
解决方案:我发现了问题。我输入" Type"使用大写字母T,单词在JavaScript中应全部小写。太傻了,花了我两天才发现它。
答案 0 :(得分:1)
您可以尝试其他方法。首先找到对象,将新的Transaction添加到对象中,然后保存它。
UserWallet.findOneAndUpdate({ userid: mongoose.Types.ObjectId(req.user.id)}, function(err, userWallet) {
userWallet.Transactions.push(newRecord);
userWallet.save();
});
答案 1 :(得分:1)
您在保存方面的做法是可以的。如果检查模式,则保存的是ObjectId,而不一定是实际对象。
如果要保存User类型的对象,则可以将实际用户模型放在UserWallet方案声明中。
但是,我建议您采用的方法是保持原样,并在检索userWallets时使用 population 。
示例:
UserWallet.find().populate('user_id').exec(function(err,userWallets){
});
现在,UserWallet的user_id字段将具有使用ObjectId引用的实际用户对象。您可以在documentation
中详细了解人口