【发布时间】:2019-11-23 01:14:50
【问题描述】:
我正在尝试每分钟获取一个 Web API 数据到 MongoDB,保存它并在有任何更改时更新。问题是volume(每个字段)字段仅在新的date 添加到ChildSchemaData 时才更新(在新交易日开始后发生) - 子文档。所有这些数据都用于在前端构建每日(不是每小时/分钟)股票图表。而且我正在尝试从数据库中流式传输它,但是由于volume(以及子文档中的所有其他字段)未在数据库中更新,因此前端没有任何变化。我正在尝试实现更改 Streams MongoDB(来自数据库的数据流),所以我坚持从数据库中获取数据。任何帮助表示赞赏。谢谢!
Edit1:$addToSet 运算符将一个值添加到数组中,除非该值已经存在,在这种情况下,$addToSet 对该数组没有任何作用。看起来这就是问题所在。我想知道是否有不同的运算符可以更新已经存在的值。
Edit2:我正在使用以下语法,但不确定它是否正确
const update = {
$addToSet: { data: webApiData },
$set: { 'data[0].$.volume': webApiData[0].volume },
};
因为它进入了相同的path,所以它不会工作
控制器
const creatStock = async (symbol, webApiData) => {
try {
const query = { symbol };
const update = { $addToSet: { data: webApiData } };
const options = { upsert: true, new: true };
await Stock.findOneAndUpdate(query, update, options);
} catch (ex) {
console.log(`creatStock error: ${ex}`.red);
}
};
架构
const ChildSchemaData = new mongoose.Schema({
_id: false,
date: { type: mongoose.Types.Decimal128 },
open: { type: mongoose.Types.Decimal128 },
high: { type: mongoose.Types.Decimal128 },
low: { type: mongoose.Types.Decimal128 },
close: { type: mongoose.Types.Decimal128 },
volume: { type: mongoose.Types.Decimal128 },
});
const ParentSchemaSymbol = new mongoose.Schema({
symbol: {
type: String,
},
// Array of subdocuments
data: [ChildSchemaData],
});
【问题讨论】:
-
那么你想更新子集合数组中的同一个元素吗?您如何确定要更新的元素?
-
我想更新任何将要更改的元素。例如,如果卷保存为 100,然后下次获取 webApi 时,相同的卷将更新为 200,依此类推。我希望我没有让你太困惑
-
我为我的问题发布了一个解决方案,但该解决方案的问题在于它会更新丢失旧数据的所有内容,我需要的是附加到现有数据。
标签: javascript node.js mongodb mongoose