能否通过ID与lang字段筛选使用findOneAndUpdate更新MongoDB嵌套记录
问题解答
这个需求完全可以实现,你之前的代码失效是因为筛选条件和更新语句的写法都不符合MongoDB嵌套数组的操作规范,修正后就可以正常运行。
原有代码的错误点
- 筛选条件写法错误:匹配数组内嵌套对象的字段时,不能直接把
locales的值设为{lang: lang},这种写法会要求locales数组完全等于你传入的对象,而不是匹配数组中存在符合条件的元素 - 更新语句写法错误:你写的
{lang: {...}}会直接在文档顶层新增一个lang字段,而不是更新locales数组里匹配到的元素
正确实现代码
const mongoose = require('mongoose'); const filter = { // 如果id是字符串类型需要先转ObjectId,要是你项目里已经做了自动转换可以跳过这步 _id: mongoose.Types.ObjectId(id), // 点语法匹配locales数组中lang等于目标值的元素 "locales.lang": lang } const product = await Product.findOneAndUpdate(filter, { // $是占位符,指代前面筛选条件匹配到的那个locales数组元素 $set: { "locales.$.title": title, "locales.$.description": description, "locales.$.price": price } }, { new: true });
内容的提问来源于stack exchange,提问作者Shared User
相关产品推荐
相关产品推荐

