Meteor中MongoDB更新报错:位置运算符未找到匹配项
解决Meteor中Mongo文档更新报错及Schema相关问题
问题详情
存储的Mongo文档
[{ _id: 'Bd5r6vmb6bu5R2chQ', run_status: true, start_time: 2024-06-23T20:19:12.000Z, stop_time: 2024-06-23T20:19:12.000Z, strategies: [], summary: '{"pnl_per":0,"pnl":0,"profit":0,"loss":0,"win":0,"lose":0,"win_per":0,"ppt":0}', result: {} }]
更新报错信息
尝试为文档添加flag: true时,抛出以下错误:
(node:81184) UnhandledPromiseRejectionWarning: MongoServerError: The positional operator did not find the match needed from the query.
使用的更新代码
let doc = LiveStrategies.find({}, {sort: {start_time: -1, limit: 1}}).fetch()[0]; LiveStrategies.update( { _id: doc._id }, { $set: { flag: true } }, (updateErr) => { if (updateErr) { console.error('Error updating document:', updateErr); return; } console.log('Document updated successfully.'); } );
当前Schema定义
StrategySchema = new SimpleSchema({ name: { type: String, label: 'Algo Name' }, instrument: { type: String, label: 'Instrument' } }); LiveStrategySchema = new SimpleSchema({ start_time: { type: Date, label: 'Start Time' }, stop_time: { type: Date, label: 'Stop Time' }, strategies: { type: Array, label: 'Strategies', optional: true }, "strategies.$": StrategySchema })
额外问题:将strategies类型改为Object后,更新不再报错,但原有的strategies数组会被置空。
原因分析
- 更新报错原因:当前
LiveStrategySchema未定义文档中已存在的run_status、summary、result字段,也未预定义要添加的flag字段。SimpleSchema默认会严格校验文档结构,在更新操作时,未定义字段的存在可能触发内部验证逻辑异常,进而抛出 positional operator 相关错误(本质是Schema校验不通过导致的连锁问题)。 - strategies被置空原因:文档中
strategies实际存储为数组类型,若强行将Schema中该字段改为Object类型,SimpleSchema会自动清理不符合类型定义的字段值,导致原有数组被置空。
解决方案
1. 修正Schema定义,匹配实际文档结构
更新LiveStrategySchema,添加所有文档中存在的字段,并确保类型匹配:
StrategySchema = new SimpleSchema({ name: { type: String, label: 'Algo Name' }, instrument: { type: String, label: 'Instrument' } }); LiveStrategySchema = new SimpleSchema({ _id: { type: String, optional: true }, run_status: { type: Boolean, optional: true }, start_time: { type: Date, label: 'Start Time' }, stop_time: { type: Date, label: 'Stop Time' }, strategies: { type: Array, label: 'Strategies', optional: true }, "strategies.$": StrategySchema, summary: { type: String, optional: true }, result: { type: Object, optional: true, blackbox: true // 允许Object字段存储任意结构 }, flag: { type: Boolean, optional: true } // 预定义要添加的字段 }); // 确保集合绑定Schema LiveStrategies = new Mongo.Collection('liveStrategies'); LiveStrategies.attachSchema(LiveStrategySchema);
2. 优化更新代码(可选)
无需先fetch文档再更新,直接通过查询条件和选项完成操作,提升效率:
LiveStrategies.update( {}, { $set: { flag: true } }, { sort: { start_time: -1 }, limit: 1, callback: (updateErr) => { if (updateErr) { console.error('Error updating document:', updateErr); return; } console.log('Document updated successfully.'); } } );
3. 保持字段类型一致性
strategies字段在文档中存储为数组,Schema中必须保持Array类型定义,避免类型不匹配导致的数据丢失。
内容的提问来源于stack exchange,提问作者Kishan Kumar Patel
相关产品推荐
相关产品推荐

