Mongoose更新子文档报错:位置运算符未找到匹配项求解决方案
解决Mongoose中添加子文档到数组的报错问题
你遇到的这个报错,核心原因是用错了MongoDB的更新操作符,而且位置操作符$的使用场景不对。
错误原因分析
你现在的需求是往position数组里添加新的子文档,但你用了$set配合位置操作符$。位置操作符$的作用是定位查询条件中匹配到的数组元素,然后对它进行更新——但你的查询条件只指定了username,没有对position数组里的元素做任何匹配,MongoDB找不到要定位的元素,自然就抛出了The positional operator did not find the match needed from the query这个错误。
正确解决方案:使用$push操作符
如果是要向数组中添加新的子文档,应该用MongoDB的$push操作符,它专门用来给数组追加元素。修改后的代码如下:
const newPos = { posA: 76.66665, posB: 109.4455567 }; Location.findOneAndUpdate( { username: username }, // 筛选目标文档的条件 { "$push": { "position": newPos } }, // 用$push把新子文档添加到数组 { new: true }, // 可选:设置为true时,返回的result是更新后的文档(默认返回更新前的) (err, result) => { if (err) throw err; console.log(result); });
补充:如果确实需要更新已有子文档
要是你的需求其实是更新数组中已存在的某个子文档,那才需要用到位置操作符$,这时候需要在查询条件里匹配到要更新的那个数组元素。比如你想更新某个特定日期的position:
const targetDate = new Date("2020-03-19"); // 示例日期 const newPos = { posA: 76.66665, posB: 109.4455567, date: new Date() }; Location.findOneAndUpdate( { username: username, "position.date": targetDate }, // 匹配到数组中指定的元素 { "$set": { "position.$": newPos } }, // 用$定位到匹配的元素并更新 { new: true }, (err, result) => { if (err) throw err; console.log(result); });
内容的提问来源于stack exchange,提问作者Jacob Fuchs
相关产品推荐
相关产品推荐

