【问题标题】:Trying to update a subdocument in a parent document mongoose尝试更新父文档猫鼬中的子文档
【发布时间】:2020-02-26 21:17:33
【问题描述】:

我正在尝试使用 mongoose 从父文档中更新或删除子文档。

我的代码:

editSubscription(req, res) {
    const token = req.headers.authorization;
    jwt.verify(token, req.app.get('yourSecretKey'), function (err, payload) {
        userModel.update({ _id: payload.user._id, "subscriptions._id": req.params.id }, { "$set": { "subscriptions.$": req.body } }, function (err, obj) {
           console.log(obj)
       })
    })
}

console.log 的输出是

{ n: 0, nModified: 0, ok: 1 }

我该怎么做?我知道它是否修改了 nModified 返回 1。我找不到任何有关如何解决或解决此问题的文档,并且我已经尝试过 stackoverflow 上的所有解决方案,但没有任何效果。

我收藏的文档样本:

id: '5db990daa05aa90de0c8b86b',
user:
{ role: 'User',
 subscriptions: [ 
  { active: true,
_id: '5dbad05aaf232e2bdc033339',
name: 'Basic Fit',
price: 20,
paymentDate: '07-11-2020',
created: '2019-10-31T12:15:22.360Z',
updated: '2019-10-31T12:15:22.360Z' },
{ active: true,
_id: '5dbad2568bf56255a0f39bc7',
name: 'Netflix',
price: 10,
paymentDate: '07-11-2019',
created: '2019-10-31T12:23:50.141Z',
updated: '2019-10-31T12:23:50.141Z' } ]
  ],
 _id: '5db990daa05aa90de0c8b86b',
 fullname: 'Test naam',
 email: 'test1@mail.com',
 password:
  '$2a$10$VzBnIcVraIRdmzy6rPHOX.7gGOXToTBNISLEfi429OfpRx02FxCaO',
 birthDate: '02-12-1988',
 created: '2019-10-30T13:32:10.276Z',
 updated: '2019-10-30T13:32:10.276Z',
 __v: 0 },

payload.user._id == 已验证的登录用户 ID

req.params.id 应该是我正在尝试编辑的订阅 ID

【问题讨论】:

  • 您能从您的收藏中发布一个示例文档吗? “payload.user._id”和“req.params.id”的值是多少?
  • @Haruo 我编辑了我的帖子..
  • 我询问了“payload.user._id”和“req.params.id”的值,以便知道它们的类型。在您的文档中,“_id”和“subscriptions._id”属于什么类型?字符串还是 ObjectId?
  • ObjectId @Haruo
  • 请在定义/设置“req.params.id”和“payload.user._id”的值时发布您的代码。

标签: node.js mongodb express mongoose


【解决方案1】:

我试过了,我得到了一个 500 错误响应..

当我删除“req.params.id”时,我会这样做:

userModel.updateOne({ _id: payload.user._id }, { "$set": { "subscriptions.0.price": 
req.body.price} }).then(user => {
           console.log(user)
        }).catch(err => {
           console.log(err)
       })

然后它可以工作,但由于我在一个数组中有多个项目,我不想只更新第一个..

我尝试在 $set 运算符中使用过滤器,但我得到的错误到处都是..

【讨论】:

    【解决方案2】:

    试试这个:

    editSubscription(req, res) {
        const token = req.headers.authorization;
        jwt.verify(token, req.app.get('yourSecretKey'), function (err, payload) {
            userModel.update({ _id: ObjectId(payload.user._id), "subscriptions._id": ObjectId(req.params.id) }, { "$set": { "subscriptions.$": req.body } }, function (err, obj) {
               console.log(obj)
           })
        })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2020-08-05
      • 2015-06-03
      相关资源
      最近更新 更多