【问题标题】:forEach how save multi data into MondoDBforEach 如何将多数据保存到 MongoDB
【发布时间】:2023-03-19 09:25:01
【问题描述】:

我有一个基于 Stripe 和 MERN 堆栈的应用程序。我的问题是,当我点击端点获取费用时,console.log 结果我看到了一系列费用。哪个好。所以我决定使用forEach 来迭代它们并提取amount 值。这行得通。

但是..

router.get('/all', (req, res) => {
    stripe.charges.list({
        limit: 3
    }).then(charges => {
        charges.data.forEach(charge => {
            return newData = new Charge({
                amount: charge.amount,
            })
        });
        newData
            .save()
            .then(charge => {
                res.json(charge)
            })
            .catch(err => console.log(err))
    })
})

当我使用forEach 根据我的模型在 MongoDB 中创建记录时,即使我在数组中至少有 3 次费用,我也只会在数据库中保存一条记录。我该如何解决?

谢谢

【问题讨论】:

    标签: arrays node.js mongodb stripe-payments


    【解决方案1】:

    您最好使用一次操作而不是多次操作。 为此:Model.insertMany 方法。 https://mongoosejs.com/docs/api.html#model_Model.insertMany

    伪代码:

    const dataForSaving = charges.data.map((charge) => {
      return {
        amount: charge.amount,
      };
    });
    
    Collection.insertMany(dataForSaving, (err, docs) => {
      if (err) {
        throw new Error(err);
      }
    
      console.log(docs);
    });
    

    【讨论】:

    • 也有效,但在每个阶段我都可以致电.save()??
    • 问题,因为在这种情况下,只要我到达端点,它就会将数据保存到数据库中。费用也有 id 所以我也想获取 i 并且你找到方法来首先比较这些费用是否已经在数据库中,如果是,则不保存它们,而只保存一次新的。
    【解决方案2】:

    累积 promise 以将每个新的 Charge 对象保存在一个数组中,并使用 Promise.all() 执行所有这些对象。

    router.get('/all', (req, res) => {
        stripe.charges.list({
            limit: 3
        }).then(charges => {
            let promises = charges.data.map(charge => {
                let newData = new Charge({ amount: charge.amount })
                return newData.save()
            });
            return Promise.all(promises);
        }).then(result => {
            res.json(result);
        }).catch(err => {
            console.log(err);
            res.error(err);
        });
    });
    

    编辑——同样的想法可以应用于更精细的承诺,例如基于另一个异步查询有条件地保存的承诺。它的轮廓看起来像这样......

    function maybeSave(newData) {
        return db.find(/*a query based on newData */).then(result => {
            return (result)? Promise.resolve() : newData.save();
        });
    }
    
            // and in the loop gathering promises...
            let promises = charges.data.map(charge => {
                let newData = new Charge({ amount: charge.amount })
                return maybeSave(newData);
            });
    

    【讨论】:

    • 问题,因为在这种情况下,只要我到达端点,它就会将数据保存到数据库中。费用也有 id 所以我也想获取 i 并且你找到方法来首先比较这些费用是否已经在数据库中,如果是,则不保存它们,而只保存一次新的。
    【解决方案3】:
    var charges = ['a', 'b', 'c'];
    
    charges.forEach(function(data) {
    db.insertMany(data,function(err,result)){
    console.log(result)
    }
    
      // SAVE DB
    });
    

    它适用于保存到数据库的数组中的每条记录

    【讨论】:

    • 我在考虑效率,也许不是从 strpie 获取数据,而是用当前费用填充数据库。它将防止将来数据库需要获取大量数据
    • 好的,谢谢...它仅用于更正用户..客户端中的数据,并获取使用 async--await 的目的 ....
    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多