Запрос ввода, который обновляет массив объектов

#arrays #json #mongodb #mongoose #put

#массивы #json #mongodb #мангуст #поместить

Вопрос:

Прошу прощения, если это дублирующий вопрос, мой мозг немного перегрелся от просмотра стольких разных статей и попыток сделать разные вещи.

Используя mongoose, в настоящее время я пытаюсь создать маршрут PUT, который может принимать массив объектов и заменять всю коллекцию новым набором данных.

Там, где я вызываю findOneAndUpdate() функцию в маршруте put, я попытался использовать эту save() функцию. Но когда я делаю это, вместо того, чтобы заменять существующие данные тем, чем я пытаюсь их заменить, он просто добавляет объекты в коллекцию в качестве новых элементов и сохраняет существующие данные. findOneAndUpdate() ничего не делает, а затем console.log(stats); срабатывает.

Вот мой запрос на размещение в файле маршрута:

 router.put("/", async (req, res) => {        
  const { PassingTouchdowns, PassingYards, PlayerID, Receptions, ReceivingTouchdowns, ReceivingYards, RushingTouchdowns, RushingYards, Week } = req.body;
  const statsField = {};
  if(PassingTouchdowns) statsField.PassingTouchdowns = PassingTouchdowns;
  if(PassingYards) statsField.PassingYards = PassingYards;
  if(PlayerID) statsField.PlayerID = PlayerID;
  if(Receptions) statsField.Receptions = Receptions;
  if(ReceivingYards) statsField.ReceivingYards = ReceivingYards;
  if(RushingTouchdowns) statsField.RushingTouchdowns = RushingTouchdowns;
  if(RushingYards) statsField.RushingYards = RushingYards;
  if(Week) statsField.Week = Week;

try {
    let playerid = await PlayerGameStatsByWeek.find({ PlayerID });
    newStats = new PlayerGameStatsByWeek({
      statsField
    });

    //For Adding multiple objects
    req.body.forEach(function(obj) {
      var stats = new PlayerGameStatsByWeek(obj);
      PlayerGameStatsByWeek.findOneAndUpdate(
        playerid, 
        { $set: stats },
        { new: true }
      );
      console.log(stats);
    });
    
    res.send({ msg: "Stats Updated!" });

} catch (err) {
    console.error(err.message);
    res.send({ msg: "Server Error" })
}
});
 

Вот моя модель:

 const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const PlayerGameStatsByWeekSchema = Schema(
  [{
    PassingTouchdowns: String,
    PassingYards: String,
    PlayerID: String,
    Receptions: String,
    ReceivingTouchdowns: String,
    ReceivingYards: String,
    RushingTouchdowns: String,
    RushingYards: String,
    Week: String
  }]
);

const Stats = module.exports = mongoose.model('stats', PlayerGameStatsByWeekSchema);

module.exports.getPlayerGameStatsByWeek = function(callback, limit) {
    Stats.find(callback).limit(limit)};
 

Вот небольшой пример того, что я хотел бы добавить в запрос PUT:

 [
    {
        "PassingTouchdowns": "0",
        "PassingYards": "0",
        "PlayerID": "123456",
        "Receptions": "6.8",
        "ReceivingTouchdowns": "0",
        "ReceivingYards": "0",
        "RushingTouchdowns": "8.5",
        "RushingYards": "900.8",
        "Week": "1"
    },
    {
        "PassingTouchdowns": "1",
        "PassingYards": "14",
        "PlayerID": "987654",
        "Receptions": "2.5",
        "ReceivingTouchdowns": "4",
        "ReceivingYards": "30",
        "RushingTouchdowns": "0",
        "RushingYards": "0",
        "Week": "2"
    }
]
 

Ответ №1:

Чтобы заменить всю коллекцию данными, вам лучше использовать агрегации mongodb, этап $out https://docs.mongodb.com/manual/reference/operator/aggregation/out /