【问题标题】:MongoDB findOneAndUpdate returns nullMongoDB findOneAndUpdate 返回 null
【发布时间】:2019-10-14 00:58:43
【问题描述】:

我有这个,但我无法让它工作。 Console.log 记录为空。 如果我在更新代码之前登录,它实际上会记录我试图编辑的项目。如果我在 findOneAndUpdate() 之后执行此操作,它将返回 null。

编辑2:

我将 mongoose 方法更改为 findById 并且它起作用了。不过还是有一个问题。新代码:

let promo = await Promo.findById(req.body._id)
      console.log('Promo findById(promoId) => ' + promo)
      console.log('Promo Fields => ' + JSON.stringify(promoFields))
      if (promo) {
        // Update
        const promo = await Promo.findOneAndUpdate(
          { promo: req.body_id },
          { $set: promoFields },
          { new: true },
          (err, doc) =>
            console.log(err + ' <--- err ///// ' + doc + ' <--- doc ')
        )
        return res.json(promo)

输出:

[0] Promo findById(promoId) => { _id: 5cee8b0134349e1eec482053,
[0]   title: 'Dos',
[0]   subtitle: 'dos',
[0]   desc: 'dos',
[0]   __v: 0 }
[0] Promo Fields => {"title":"Dos","subtitle":"dos","desc":"dos"}
[0] null <--- err ///// { _id: 5cee6bcbcfd3f11d580aa715,
[0]   new: false,
[0]   desc: 'dos',
[0]   subtitle: 'dos',
[0]   title: 'Dos' } <--- doc

现在的问题是,无论我编辑列表中的哪个项目,它总是会更新第一个项目。会不会是id不匹配?如果我从 req 调试 id,我从所选项目中获得了正确的 id。不知道它为什么会这样。 最后但并非最不重要的是减速器:

const initialState = {
  promos: null
}

export default function(state = initialState, action) {
  const { type, payload } = action

  switch (type) {
    case POST_PROMOS:
      return {
        ...state,
        ...payload,
        loading: false
      }
    default:
      return state
  }
}

我想知道我是否可以在 reduce 中制作类似

state.promos.filter(promo => promo._id !== payload)

然后使用有效负载项生成一个新数组。我在混合概念?

提前谢谢你

【问题讨论】:

  • promoFields 指的是什么?
  • 我的坏@developing2020,已经编辑过。
  • 我读到它在更新之前记录了该项目。那么你可以在 findOne 之后添加 console.log(promo) 的输出吗?
  • @JackRed 如果我在if(promo){ 行之前运行它,它会记录实际项目
  • @JackRed 并且如果我 return res.json(promo), console.log(promo) 都在同一行中,然后记录它,它会保持为空

标签: node.js mongodb mongoose


【解决方案1】:

宾果! 似乎 req.body._id 出于某种原因,即使它是来自所需编辑项的 Id,但它不是 ObjectId。

let promoId = mongoDb.ObjectId(req.body._id)然后

promo = await Promo.findOneAndUpdate(
          { _id: promoId },
          { $set: promoFields },
          { new: true }
        )

:)!谢谢

【讨论】:

    【解决方案2】:

    您应该使用$addToSet 代替$set,它可能会起作用。

    【讨论】:

    • 相同的输出.. null。可以是模型id吗?
    • 你调试了吗?也许你错过了一些东西。
    猜你喜欢
    • 2016-01-26
    • 2020-09-13
    • 2016-05-08
    • 2020-04-11
    • 2019-05-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多