MongoDB findOneAndUpdate返回null

时间:2019-05-28 13:18:43

标签: node.js mongodb mongoose

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

编辑2:

我将猫鼬方法更改为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
  }
}

我想知道是否可以通过减少

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

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

提前谢谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

宾果! 看来req.body._id出于某种原因,即使它是所需编辑项目中的ID,也不是ObjectId。

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

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

:)!谢谢