在子文档中推送JSON文档只插入ObjectId

时间:2017-12-31 16:53:15

标签: json node.js mongodb mongoose push

我在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中应全部小写。太傻了,花了我两天才发现它。

2 个答案:

答案 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

中详细了解人口