moongose db中的唯一键

时间:2015-06-03 08:26:03

标签: mongodb mongoose

我有以下数据库:

{
        "_id" : ObjectId("556da79a77f9f7465943ff93"),
        "guid" : "a12345",
        "update_day" : "12:05:10 02.06.15"
}
{
        "_id" : ObjectId("556dc4509a0a6a002f97e972"),
        "guid" : "bbbb",
        "update_day" : "15:03:10 02.06.15"
        "__v" : 0
}
{
        "_id" : ObjectId("556dc470e57836242f5519eb"),
        "guid" : "bbbb",
        "update_day" : "15:03:10 02.06.15"
        "__v" : 0
}
{
        "_id" : ObjectId("556dc47c7e882d3c2fe9e0fd"),
        "guid" : "bbbb",
        "update_day" : "15:03:10 02.06.15"
        "__v" : 0
}

我想将guid设置为唯一,因此不能复制(就像MYSQL中的主键一样)。所以DB看起来像这样:

   {
            "_id" : ObjectId("556da79a77f9f7465943ff93"),
            "guid" : "a12345",
            "update_day" : "12:05:10 02.06.15"
    }
    {
            "_id" : ObjectId("556dc4509a0a6a002f97e972"),
            "guid" : "bbbb",
            "update_day" : "15:03:10 02.06.15"
            "__v" : 0
    }

当我要插入另一个" guid":" bbbb" (使用save命令),它将失败。

3 个答案:

答案 0 :(得分:3)

在mongoose中声明架构时,请执行此操作

guid : { type : String, unique : true}

如果你想让mongodb自己创建guid(比如_id),那么就这样做

guid : { type : String, index : { unique : true} }

答案 1 :(得分:1)

首先,您必须处理MongoDB集合的当前状态并删除所有重复的文档。

有一件事是肯定的:您将无法在集合中创建包含重复项的唯一索引,dropDupes现在因version 2.7.5而被弃用,因此您无法使用它。顺便说一下,它被删除了,因为几乎不可能预测在这个过程中会删除哪个文件。

两种可能的解决方案:

  1. 创建一个新集合。在此新集合上创建唯一索引并运行批处理以将旧集合中的所有文档复制到新集合,并确保在此过程中忽略duplicated key error

  2. 手动在自己的收藏中处理它:

    • 确保您不会在代码中插入更多重复的文档,
    • 在您的收藏集上运行批处理以删除重复项(如果它们不完全相同,请确保保留好的),
    • 然后添加唯一索引。
  3. 我会在mongoose中声明我的guid:

    guid : { type : String, unique : true}

答案 2 :(得分:-1)

您可以按照此处的说明操作: create unique index。这正是你所需要的。