Сохранение данных в массив в mongoose - PullRequest
0 голосов
/ 11 января 2019

Пользователи могут размещать элементы, которые могут запрашивать другие пользователи. Таким образом, пользователь создает один элемент, и многие пользователи могут запросить его. Итак, я подумал, что наилучшим способом было бы включить в схему продукта множество пользователей, для которых он был запрошен. А пока я просто хочу сохранить этот идентификатор пользователя и имя. Вот схема:

const Schema = mongoose.Schema;

const productSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    category: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    userId: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    requests: [
        {
            userId: {type: Object},
            firstName: {type: String}

        }
    ],
});

module.exports = mongoose.model('Product', productSchema);

В моем контроллере я сначала нахожу элемент, а затем вызываю save ().

exports.postRequest = (req, res, next) => {
  const productId = req.body.productId;
  const userId = req.body.userId;
  const firstName = req.body.firstName;
  const data = {userId: userId, firstName: firstName};
  Product.findById(productId).then(product => {
    product.requests.push(data);
    return product
      .save()
      .then(() => {
        res.status(200).json({ message: "success" });
      })
      .catch(err => {
        res.status(500).json({message: 'Something went wrong'});
      });
  });
};

Во-первых, можно ли так делать? Я нашел несколько сообщений об этом, но они не находят и не вызывают save, они используют findByIdAndUpdate () и $ push. «Это неправильно» делать так, как я это сделал? Это второй способ, которым я попробовал, и я получаю тот же результат в базе данных:

exports.postRequest = (req, res, next) => {
    const productId = req.body.productId;
    const userId = req.body.userId;
    const firstName = req.body.firstName;
    const data = {userId: userId, firstName: firstName};
    Product.findByIdAndUpdate(productId, {
        $push: {requests: data}
    })
    .then(() => {
        console.log('succes');
    })
    .catch(err => {
        console.log(err);
    })
  };

А во-вторых, если вы посмотрите на снимок экрана, данные в правильном формате и структуре? Я не знаю, почему там есть _id, а не просто идентификатор пользователя и имя. enter image description here

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Обычно разработчики сохраняют только ссылку на другую коллекцию (пользователей) в коллекции (продукте). Кроме того, вы также сохранили имя пользователя. Это хорошо.

Оба ваших метода работают. Но второй метод был добавлен в MongoDB именно для вашей конкретной потребности. Таким образом, без вреда при использовании второго метода.

0 голосов
/ 11 января 2019

Нет ничего плохого в том, чтобы делать это так, как вы это сделали. Использование сохранения после запроса дает вам возможность проверить некоторые вещи в данных, а также для одного. и вы можете добавить дополнительные поля (если включены в схему). например, если в вашем текущем возвращении json нет поля с именем last_name, вы можете добавить его и сохранить документ, что является преимуществом.

При использовании findById () вы фактически не можете вносить изменения, кроме того, что вы программируете для этого

Одна вещь, которую я заметил ... В вашей схеме, после того, как вы скомпилируете ее с помощью mongoose.modal ()

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

const Product = module.exports = mongoose.model('Product', productSchema);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...