MongoDB findOneAndUpdate 返回 null

Posted

技术标签:

【中文标题】MongoDB findOneAndUpdate 返回 null【英文标题】:MongoDB findOneAndUpdate returns 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) 都在同一行中,然后记录它,它会保持为空 【参考方案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吗? 你调试了吗?也许你错过了一些东西。

以上是关于MongoDB findOneAndUpdate 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - Mongoose 查询 findOneAndUpdate() 不更新/复制数据库

findOneAndUpdate 未在 MongoDb 中返回更新的文档 [重复]

findOneAndUpdate 未在 MongoDb 中返回更新的文档 [重复]

如何在 mongodb 的 findOneAndUpdate 中使用对象作为过滤器

MongoDB findOneAndUpdate 返回 null

MongoDB findOneAndUpdate 返回 null