Mongoose:如何更新数组中的现有元素?

我想知道是否有更好的方法来更新数组中的现有元素,而不是三次获取数据库。如果您有任何想法,我将不胜感激。谢谢!


    const creatStock = async (symbol, webApiData) => {

      try {

        // reversed array

        const webApiDataReversed = webApiData.reverse();


        const query = { symbol };

        const update = { $addToSet: { data: webApiDataReversed } };

        const options = { upsert: true, new: true };

        // create/update Stock

        const stockResult = await Stock.findOneAndUpdate(query, update, options);

        const lastElement = stockResult.data.length - 1;


        const updatePull = {

          $pull: { data: { date: stockResult.data[lastElement].date } },

        };

        // removes last date from data array

        await Stock.findOneAndUpdate(query, updatePull);

        // update Stock

        await Stock.findOneAndUpdate(query, update);

      } 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,

    unique: true,

  },

  // Array of subdocuments

  data: [ChildSchemaData],

});


module.exports.Stock = mongoose.model('Stock', ParentSchemaSymbol);

输出

http://img3.mukewang.com/61d7ff570001736404380461.jpg

凤凰求蛊
浏览 351回答 2
2回答

哆啦的时光机

好吧,如果您不需要返回更新后的文档,请尝试这个 - 这只会返回一个写入结果,这样可以在一次 DB 调用中实现:const creatStock = async (symbol, webApiData) => {    try {        // reversed array        const webApiDataReversed = webApiData.reverse();        const query = { symbol };        await Stock.bulkWrite([            {                updateOne:                {                    "filter": query,                    "update": { $pop: { data: 1 } }                }            }, {                updateOne:                {                    "filter": query,                    "update": {                        $addToSet: {                            data: webApiDataReversed                        }                    }                }            }        ])    } catch (ex) {        console.log(`creatStock error: ${ex}`.red);    }};

aluckdog

你可以这样做:  const creatStock = async (symbol, webApiData) => {  try {    // reversed array    const webApiDataReversed = webApiData.reverse();    const query = { symbol };    let stock =  await Stock.findOne(query);    if(stock){       let stockData = JSON.parse(JSON.stringify(stock.data));       if(stockData.length>0){          stockData.pop();        }       stockData.concat(webApiDataReversed);       stock.data = stockData;       await stock.save();    }  } catch (ex) {      console.log(`creatStock error: ${ex}`.red);  }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript