如何为MongoDB子文档数组中的日期字段创建唯一索引?
解决MongoDB股票报价数组子文档日期重复及索引问题
1. 清理现有文档中的重复日期子文档
当前集合中存在同一ticker下quotes数组包含重复日期子文档的情况,可通过聚合管道更新完成去重:
db.aggregates_1_day.updateMany( {}, [ { $set: { quotes: { $reduce: { input: "$quotes", initialValue: [], in: { $cond: [ { $in: ["$$this.date", "$$value.date"] }, "$$value", { $concatArrays: ["$$value", ["$$this"]] } ] } } } } } ] )
该操作遍历每个文档的quotes数组,仅保留每个日期对应的唯一子文档。
2. 创建复合唯一索引保障数据唯一性
若要实现同一股票(ticker)下报价日期唯一,需创建ticker与quotes.date的复合唯一索引——不能单独给quotes.date建唯一索引,否则会限制全集合所有股票的报价日期不能重复,不符合业务逻辑:
db.aggregates_1_day.createIndex( { "ticker": 1, "quotes.date": 1 }, { unique: true } )
索引创建完成后,MongoDB会阻止任何向同一ticker添加重复日期报价的插入或更新操作,抛出重复键错误。
内容的提问来源于stack exchange,提问作者Pawan
相关产品推荐
相关产品推荐

