【问题标题】:pushing JSON document in subdocument inserts only ObjectId在子文档中推送 JSON 文档仅插入 ObjectId
【发布时间】:2018-06-11 04:10:36
【问题描述】:

我在 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 更改),但是从来没有我打算插入的文档。

这里出了什么问题?我希望插入新的子文档会很容易。

解决方案:我找到了问题所在。我用大写的 T 输入了“Type”,并且这个词在 JavaScript 中应该全部小写。太傻了,花了我2​​天时间才发现。

【问题讨论】:

    标签: json node.js mongodb mongoose push


    【解决方案1】:

    您可以尝试另一种方法。先找到对象,给对象添加新的Transaction,保存。

    UserWallet.findOneAndUpdate({ userid: mongoose.Types.ObjectId(req.user.id)}, function(err, userWallet) {
        userWallet.Transactions.push(newRecord);
        userWallet.save();
    });
    

    【讨论】:

    • 这是一种更普通的旧 Javascript 方法是吗?没问题,我试试看是否适合我!
    • 不是旧的 JavaScript,我认为它是一种更 Mongoose 的方法。使用官方的 MongoDB 客户端无法做到这一点。
    • 谢谢,我找到了。原始代码有效,但架构定义包含错误:Type with capital T.
    【解决方案2】:

    您的储蓄方法还可以。如果您检查您的架构,您所保存的是一个 ObjectId 而不一定是一个实际的对象。

    如果您想保存 User 类型的对象,那么您可以将实际的 User Model 放入您的 UserWallet 方案声明中。

    但是,针对您的情况,我建议的方法是保持原样,并在检索用户钱包时使用 population

    例子:

    UserWallet.find().populate('user_id').exec(function(err,userWallets){
    
    });
    

    现在 UserWallet 的 user_id 字段将具有使用 ObjectId 引用的实际用户对象。你可以在documentation阅读更多关于人口的信息

    【讨论】:

    • 感谢 Asyene,感谢您的帮助。我还没有尝试填充。我想我必须将 userid 字段放入 find() 并在您的示例中填充文档?在这种情况下,我正在使用特定用户 ID 搜索文档,并希望将新文档添加到数组中。
    • 是的,您应该将您要查找的 user_id 作为键值对放在 find 函数中。然后还填充结果的 user_id 字段。这样,您可以执行 UserWallet.user_id.username、UserWallet.user_id.id、UserWallet.user_id.email 等。
    • 谢谢,我找到了。原始代码有效,但架构定义包含错误:Type with capital T.
    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 2016-04-17
    • 2016-05-03
    • 1970-01-01
    • 2016-12-14
    • 2022-01-13
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多