Как предотвратить дублирование документов Mongodb с Mongoose - PullRequest
0 голосов
/ 25 октября 2018

У меня есть коллекция пользователей и коллекция портфолио на mongodb.Модель портфолио ссылается на объект коллекции пользователей.Я пытаюсь сделать так, чтобы, когда пользователь вошел в систему, и они пытаются добавить документ, который у них уже есть, маршрутизатор предотвращает это.Прямо сейчас все, что это делает, это просматривает все документы в коллекции портфеля, но я пытаюсь сначала отфильтровать его по пользователям, а затем выполнить поиск по имени, чтобы увидеть, есть ли оно там.

  portfolio.find({name: req.body.name})
  .count()
  .then(count => {
    if (count > 0) {
      // There is an existing user with the same username
      res.status(400).json({message: 'Stock already saved!'});
    }else{
     portfolio
     .create({
       user: req.body.user,
       name: req.body.name,
       description: req.body.description,
       symbol: req.body.symbol,
       image: req.body.image,
     })
     .then(portfolioPost => res.status(201).json(portfolioPost.serialize()))
     .catch(err => {
       // console.error(err);
       res.status(500).json({ error: 'Something went wrong' });
     });
    }
  })

это модель

const listSchema = mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: "Users" },
  name: { type: String, required: true },
  description: {type:String, required: true},
  image: {type:String},
  symbol: {type: String, required: true}
});

1 Ответ

0 голосов
/ 25 октября 2018

Использование {unique: true} Таким образом, всякий раз, когда кто-либо пытается использовать один и тот же идентификатор пользователя для нескольких портфелей, мангуст выдаст ошибку.

Ваша модель будет тогда

const listSchema = mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: "Users", unique: true },
  name: { type: String, required: true },
  description: {type:String, required: true},
  image: {type:String},
  symbol: {type: String, required: true}
});

Я использовал user properties unique .Таким образом, никакие две схемы списка не могут иметь одинаковый идентификатор пользователя.

Наконец, вы можете пропустить поиск предыдущего портфолио пользователя.Ваш код может быть

portfolio
     .create({
       user: req.body.user,
       name: req.body.name,
       description: req.body.description,
       symbol: req.body.symbol,
       image: req.body.image,
     })
     .then(portfolioPost => res.status(201).json(portfolioPost.serialize()))
     .catch(err => {
       // console.error(err);
       res.status(500).json({ error: 'Something went wrong' });
     });

В этом случае, если уже есть портфель с текущим идентификатором пользователя, MongoDB будет отправлено сообщение об ошибке.

Для получения более подробной информации, пожалуйста, проверьте Дополнительные параметры раздел.

...