Javascript Mongoose:findOneAndUpdate不更新现有字段
我试图每分钟将一个web API数据提取到MongoDB,保存它,并在有任何更改时进行更新。问题是当新的Javascript Mongoose:findOneAndUpdate不更新现有字段,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图每分钟将一个web API数据提取到MongoDB,保存它,并在有任何更改时进行更新。问题是当新的日期添加到ChildSchemaData-子文档时,volume(每个字段)字段仅更新(在新交易日开始后发生)。所有这些数据都用于在前端构建每日(而不是每小时/分钟)的股票图表。我试图从数据库中对其进行流式传输,但由于卷(以及子文档中的所有其他字段)在数据库中没有更新,因此前端没有任何变化。我试图实现change Streams MongoDB(来自数据库的数据流),所以我坚持从数据库获取数据
日期添加到ChildSchemaData
-子文档时,volume
(每个字段)字段仅更新(在新交易日开始后发生)。所有这些数据都用于在前端构建每日(而不是每小时/分钟)的股票图表。我试图从数据库中对其进行流式传输,但由于卷
(以及子文档中的所有其他字段)在数据库中没有更新,因此前端没有任何变化。我试图实现change Streams MongoDB(来自数据库的数据流),所以我坚持从数据库获取数据。感谢您的帮助。谢谢大家!
Edit1:除非值已经存在,否则$addToSet
运算符会将值添加到数组中,在这种情况下,$addToSet
不会对该数组执行任何操作。看起来这就是问题所在。我想知道是否有其他运算符可以更新已经存在的值
Edit2:我一直在玩弄下面的语法,但不确定它是否正确
const update = {
$addToSet: { data: webApiData },
$set: { 'data[0].$.volume': webApiData[0].volume },
};
因为它进入了相同的路径
,所以无法工作
控制器
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且设置为200的卷
字段更新嵌入式阵列的示例:
db.getCollection("collection").findOneAndUpdate({
id: 1,
"data.volume": 100
},
{ $set: { "data.$.volume": 200 }
});
那么您想更新子集合数组中的相同元素?如何确定要更新的元素?我想更新任何要更改的元素。例如,如果卷保存为100,那么下次获取webApi时,同一卷将更新为200,依此类推。我希望我没有把你弄糊涂。我给我的问题贴了一个解决方案,但这个解决方案的问题是,它会更新所有丢失的旧数据,我需要的是附加到现有的数据。我想它在今天可以工作,但到了第二天,我们需要在数组中附加一个新的日期并更新卷在当日交易结束前,我想知道是否可以进行此const update={$addToSet:{data:webApiData},$set:{'data[0].$.volume':webApiData[0].volume},}代码>找到了解决方案。需要写一个解释过程的答案-将在早上更新。
db.getCollection("collection").findOneAndUpdate({
id: 1,
"data.volume": 100
},
{ $set: { "data.$.volume": 200 }
});