当前位置: 首页 > 知识库问答 >
问题:

如何绕过E11000 MongoError而不删除“unique:true”

方昊英
2023-03-14

我试图建立一个论坛,以了解平均堆栈。我在使用猫鼬时遇到了一个问题。。。

我有这个...

var UserSchema = new Schema({
  id: ObjectId,
  firstName: String,
  lastName: String,
  role: String,
  email: {
    type: String,
    unique: true
  },
  password: String,
  workers: [WorkerSchema]
});

var TopicSchema = new Schema({
  id: ObjectId,
  title: String,
  moderator: UserSchema,
  posts: [PostSchema]
});

var Topic = mongoose.model('Topic', TopicSchema);

app.post('/topics', requireLogin, function(req, res) {
  User.findOne({"email": req.session.user.email}, function(err, user) {
    if (user.role == "moderator" || user.role == "admin") {
      var topic = new Topic({
        title: req.body.title,
        moderator: req.session.user,
        posts: []
      });
      topic.save(function(err) {
        if (err) console.log(err);
        res.status(204).end();
      });
    }
  });
});

我的问题是...当我将主题发布到 /topics时,它第一次工作,用一个项目填充主题集合。但是,当我再次从同一个用户发布到 /topics时,我得到了一个E11000 MongoError,如下所示:消息:“E11000重复键错误索引:MY_MONGO_DB。主题。$moderator.email_1dup键: {: " myuser@example.com”}”

我知道从用户模式的电子邮件字段中删除“唯一:真实”属性可以解决这个问题,但是我不想删除这个唯一属性,因为我在代码的其他地方使用它来确保用户通过电子邮件是唯一的。

有没有办法绕过这个?换句话说,有没有办法保持“唯一:真实”的属性,同时保留用户在不触发E11000错误的情况下发布多个主题的能力?

共有1个答案

华献
2023-03-14

您所做的是嵌入用户。在数据库中,生成的文档类似于

{
  ...
  moderator: {..., email: "john@example.com"}
}

当然,如果你让同一个人做两次主持人,这将违反唯一的约束。

您应该做的是在模式中引用用户:

var user = mongoose.model('User', UserSchema);

var TopicSchema = new Schema({
  id: ObjectId,
  title: String,
  moderator: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
  posts: [PostSchema]
});
 类似资料:
  • 问题内容: 我刚刚在android应用程序中编写了一个函数,该函数使用Java中的标准“文件”类删除文件。即: 尽管上面的过程很简单,但我一直想知道通过“ ContentResolver”执行该操作是否有任何好处。任何意见,将不胜感激。 干杯, 杰瑞德 ------------------------------------------编辑------- 这是通过Content Resolver删

  • 问题内容: 我有一个浮点数的大数据集。我遍历它们并为它们中的每一个进行评估。我懂了 我想解决这个问题,如果发生此错误,则返回0。 我正在考虑定义一个新功能: 基本上,我需要一种测试输出是否正确的方法,但我不知道如何进行。感谢您的帮助! 问题答案: 由于for为负无穷大,因此我只需要检查输入值是否为零并返回您想要的值即可: 编辑 :小编辑:您应该检查所有小于或等于0的值。 编辑2 :当然是在nump

  • 如何在不删除索引映射的情况下从elasticsearch数据库中删除数据? 我是Tire gem,使用删除命令删除我所有的映射并再次运行创建命令。我想避免创建命令一次又一次地运行。 请帮我解决这个问题。

  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得

  • 问题内容: 比方说: 对此: 我一直在寻找使用Mootools,jQuery甚至是(原始)JavaScript的方法,但是却不知道该怎么做。 问题答案: 使用jQuery,您可以执行以下操作: 快速链接到文档: 内容(): jQuery replaceWith( 内容 :[ 字符串 | 元素 | jQuery ]): jQuery

  • 问题内容: 我遇到了一个问题。我不知道如何在不将后记留空的情况下删除行。 我正在使用Apache-POI 3.9,使用下一个代码时出现错误: 更新版本: 我找到了解决方案:但是由于每个删除行都减少了lastRowNum,所以我得到了空指针。 这是新版本: 最后更新: ManishChristian帮助我解决了这个问题! 问题答案: 试试下面的代码,它应该可以工作: 每次删除一行都需要减少一。并再次