为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

凤凰求蛊 2022-01-07 16:52:21
我想知道是否有更好的方法来更新数组中的现有元素,而不是三次获取数据库。如果您有任何想法,我将不胜感激。谢谢!    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);输出
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

好吧,如果您不需要返回更新后的文档,请尝试这个 - 这只会返回一个写入结果,这样可以在一次 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);

    }

};


查看完整回答
反对 回复 2022-01-07
?
aluckdog

TA贡献1847条经验 获得超7个赞

你可以这样做:


  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);

  }


查看完整回答
反对 回复 2022-01-07
  • 2 回答
  • 0 关注
  • 342 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信