如何防止猫鼬使用mongodb复制文档

时间:2018-10-24 23:47:40

标签: node.js mongodb express mongoose mongoose-schema

我在mongodb上有一个用户集合和一个投资组合集合。投资组合模型引用用户集合的对象ID。我正在尝试这样做,以便当用户登录时,他们尝试添加已经拥有的文档时,路由器会阻止它。现在,所有这些操作都是查看投资组合集合中的所有文档,但是我想先按用户过滤它,然后搜索名称以查看它是否在那里。

.catch(error => res.status(error.response.status).send(error.response.statusText);

这是模型

  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' });
     });
    }
  })

1 个答案:

答案 0 :(得分:0)

使用 {unique:true} 因此,每当有人尝试对多个项目组合使用相同的用户ID时,猫鼬都会抛出错误。

您的模型将会是

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 属性唯一。因此,两个列表架构都不能具有相同的userId。

最后,您可以跳过查找以前的用户组合的过程。您的代码可以是

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' });
     });

在这种情况下,如果已经有使用当前userId的投资组合,则MongoDB将收到错误消息。

有关更多详细信息,请检查Additional Options部分。