0

我正在创建一个 Mongoose 种子并创建“宠物”文档。对于我的数据库中的每个避难所(20 个文档),我想插入在我的代码的第一行中创建的宠物数组的随机数。

我希望得到:

收容所1:{狗:[“dog.id1”,“dog.id18”]}......收容所20:{狗:[“dog.id14”,“dog.id2”,“dog.id17”]}

这些宠物的数量和ID是随机的。

我已经尝试使用下面的代码,但是:虽然我没有收到任何错误,但我只得到了前两个带有“狗”的庇护所,其余的显示为空白:像这样:

收容所 1:{ 狗:[“dog.id1”,“dog.id18”] },收容所 2:{ 狗:[“dog.id2”] }...收容所 3-20:{ 狗:[ ] }

我想问题出在地图功能和我正在做的金额分配上。

const shelterPromises = shelters
    .map((shelter) => {
      const petAmount = randomNumber(1, 10);
      const randomPets = pets.slice(prevIndex, petAmount);
      
      if (randomPets.length) {
        prevIndex = prevIndex + petAmount;
        return ShelterModel.findByIdAndUpdate(shelter._id, {
          dogs: randomPets
        });
      }

      return null;
    })
    .filter(Boolean);

  await Promise.all(shelterPromises);
  console.info('> shelters updated!');
};

我的完整代码如下:

const faker = require('faker');

const PetModel = require('../models/Pets');
const ShelterModel = require('../models/Shelter');

const randomNumber = (min, max) =>
  Math.floor(Math.random() * (max - min)) + min;

const randomArray = (array) => array[Math.floor(Math.random() * array.length)];

const randomMonthYear = ['Month', 'Year'];
const randomBreed = [
  'Collie',
  'Podenco',
  'Breton',
  'Mestizo',
  'German Sheperd',
  'Akbash',
  'Husky',
  'Golden Retriever',
  'Basset Hound'
];

const createPets = async (rowsCount) => {
  const pets = [];

  for (let i = 0; i < rowsCount; i++) {
    const {
      name: { firstName },
      lorem: { paragraph },
      image: { animals },
      date: { past }
    } = faker;

    const name = firstName();
    const age = randomNumber(1, 20).toString();
    const ageMonthYear = randomArray(randomMonthYear);
    const weight = randomNumber(1, 80).toString();
    const img = animals();
    const breed = randomArray(randomBreed);
    const dateArrivalInShelter = past();
    const about = paragraph();

    pets.push(
      new PetModel({
        name,
        age,
        ageMonthYear,
        weight,
        img,
        breed,
        dateArrivalInShelter,
        about
      })
    );
  }

  await PetModel.insertMany(pets);

  console.info('> pets created!');

  const shelters = await ShelterModel.find({});
  let prevIndex = 0;

  const shelterPromises = shelters
    .map((shelter) => {
      const petAmount = randomNumber(1, 10);
      const randomPets = pets.slice(prevIndex, petAmount);
      
      if (randomPets.length) {
        prevIndex = prevIndex + petAmount;
        return ShelterModel.findByIdAndUpdate(shelter._id, {
          dogs: randomPets
        });
      }

      return null;
    })
    .filter(Boolean);

  await Promise.all(shelterPromises);
  console.info('> shelters updated!');
};

const dropPets = async () => {
  await PetModel.deleteMany({});

  console.info('> pets collection deleted!');
};

module.exports = {
  createPets,
  dropPets
};

4

1 回答 1

0

因为你prevIndex在增加prevIndex = prevIndex + petAmountpetAmount总是在范围内1->10,所以在一些循环之后,prevIndex将大于 petAmount并且pets.slice(prevIndex, petAmount)只会返回一个空数组。要解决此问题,您可以将代码更改为:

const randomPets = pets.slice(prevIndex, prevIndex + petAmount);
于 2021-05-05T01:51:15.597 回答