Javascript Mongoose:findOneAndUpdate不更新现有字段

Javascript Mongoose:findOneAndUpdate不更新现有字段,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图每分钟将一个web API数据提取到MongoDB,保存它,并在有任何更改时进行更新。问题是当新的日期添加到ChildSchemaData-子文档时,volume(每个字段)字段仅更新(在新交易日开始后发生)。所有这些数据都用于在前端构建每日(而不是每小时/分钟)的股票图表。我试图从数据库中对其进行流式传输,但由于卷(以及子文档中的所有其他字段)在数据库中没有更新,因此前端没有任何变化。我试图实现change Streams MongoDB(来自数据库的数据流),所以我坚持从数据库获取数据

我试图每分钟将一个web API数据提取到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 } 
});