使用mongoose的updateMany方法$pull时提示”不能将类型XXX分配给类型“never”“

312 阅读1分钟

众所周知,Mongo提供了一个很实用的修改对象数组中元素的方法:$pull,当你在数据库里操作时,这个方法是可以正常使用的:

db.getCollection("pubInfo").updateMany({"tag": {$elemMatch: {"tagId": "asdf"}}}, {$pull: {"tag": {"tagId": "qwer"}}})

但当你在nodejs中(或者只是nest框架里会有这个问题我也不清楚),可能会遇到这样一个报错:不能将类型XXX分配给类型“never”

image.png

$pull替换成$set是一点事没有,简直匪夷所思。

上网去搜$pull的用法,弹出来的都是如何在mongodb中使用,似乎完全没人提到在mongoose里使用会发生什么问题,太怪了。

接着我在这个网站找到了一个询问为什么没生效的问题,但我把他的内容直接复制进我的代码,编辑器还是直接报错了,压根不会到不生效这一步(启动都会报错)。

image.png

然后看其他的教学博客有写这种:

image.png

发现他用的不是updateMany而是updateOne,抱着死马当活马医的心态,换了一下方法

image.png

image.png

莫名奇妙。

但是生活还是要继续,代码还是要接着写。

只更新一个肯定是不满足我的业务要求的,还是得想办法更新所有。

在继续探索的路上发现了一篇9年前的古董

image.png

最后,我在这里遇见了一位和我遇到问题十分相近的老哥

image.png

也是在使用$pull的过程中遇到了莫名奇妙的编辑器报错问题

image.png

这位名字看上去像是随便打的好兄弟提出来,这个问题会在5.12.4版本被修复,咱也不知道这里的5.12.4版本是ts版本还是mongoose版本,如果是ts版本的话我看了一眼现在的最新版本是4.8,4.9版本还在公测;如果是mongoose版本的话我现在用的是9.2.0,看来这个问题是没被修复的。

image.png

虽然没直接解决问题,但是给了我解决问题的灵感,既然$pull只允许any类型的参数,那把参数设成any类型不就好了嘛

image.png

运行程序,查看数据库,数据删除成功,大功告成,可喜可贺,可喜可贺。

ps: 小彩蛋:帮助我解决问题的这位好兄弟在文章中的另一个链接中也出现了,你能找到是哪一篇吗?

image.png