如何按日期将元素原地插入有序数组且无需知晓$position索引?
实现方案
场景1:直接在MongoDB数据库层面操作(推荐,无需拉取全量数组)
MongoDB 4.2及以上版本支持$push更新运算符搭配$sort修饰符,不需要手动计算插入位置,插入的同时会自动对整个数组按指定字段排序,性能最优,不会产生并发冲突问题。
// 示例中集合名为stock,将查询条件替换为你要更新的具体文档的匹配规则即可 db.stock.updateOne( {}, // 此处替换为目标文档的查询条件,比如{_id: xxx} { $push: { data: { $each: [ // 此处放入要插入的一条/多条新数据 { open: 54.66, high: 57.990002, close: 50, low: 48.34, volume: 3230400, date: ISODate("2021-06-29T00:00:00.000Z") } ], $sort: { date: 1 } // 1代表按date升序排列,-1代表降序,和需求的时间先后逻辑匹配 } } } )
场景2:应用层用JavaScript处理(需要先把数组拉到本地操作时使用)
如果原数组已经是有序状态,推荐用二分查找定位插入位置,不需要全量排序,性能更好:
// 二分查找获取插入索引 function getInsertPos(arr, targetDate) { let left = 0, right = arr.length while (left < right) { const mid = (left + right) >>> 1 if (arr[mid].date < targetDate) left = mid + 1 else right = mid } return left } // 原数组、新数据示例 const originData = [/* 你拿到的原data数组内容 */] const newItem = { open: 54.66, high: 57.990002, close: 50, low: 48.34, volume: 3230400, date: new Date("2021-06-29T00:00:00.000Z") } // 插入数据 const insertPos = getInsertPos(originData, newItem.date) originData.splice(insertPos, 0, newItem)
如果数据量很小,可以直接插入后全量排序,代码更简洁:
originData.push(newItem) originData.sort((a, b) => a.date - b.date)
内容的提问来源于stack exchange,提问作者xDG
相关产品推荐
相关产品推荐

