【问题标题】:Sails.js & MongoDB: duplicate key error indexSails.js & MongoDB:重复键错误索引
【发布时间】:2014-02-10 04:57:41
【问题描述】:

我正在使用 Sails.js (0.9.8) 和 MongoDB(通过sails-mongo 适配器)创建可以定位在树视图中的页面集合。我想将页面的路径存储在 UUID 数组中

我的模特:

module.exports = {    
    schema: true,
    attributes: {
        uuid: {
            type: 'string',
            unique: true,
            required: true,
            uuidv4: true
        },
        name: {
            type: 'string',
            required: true,
            empty: false
        },
        path: {
            type: 'array',
            required: true,
            array: true
        }
    }
}

当我保存一个“根”页面时效果很好(“路径”属性只有一项,因为它是一个根页面。这是它在 MongoDB 中保存的内容:

{
    _id: ObjectId("52f853e9609fb6c0341bdfcc"),
    createdAt: ISODate("2014-02-10T04:22:01.828Z"),
    name: "Home Page",
    path: [
        "a2b23e1f-954b-49a3-91f1-4d62d209a093"
    ],
    updatedAt: ISODate("2014-02-10T04:22:01.833Z"),
    uuid: "a2b23e1f-954b-49a3-91f1-4d62d209a093"
}

但是当我想在我之前创建的页面(主页/产品)下面创建一个“子页面”时,我收到了这个错误:

MongoError: E11000 重复键错误索引:cms-project.item.$path_1 复制键:{:“a2b23e1f-954b-49a3-91f1-4d62d209a093”}

这是我发送的数据:

{ name: 'Products',
  uuid: 'a004ee54-7e42-49bf-976c-9bb93c118038',
  path: 
   [ 'a2b23e1f-954b-49a3-91f1-4d62d209a093',
     'a004ee54-7e42-49bf-976c-9bb93c118038' ] }

我可能错过了一些东西,但我不知道是什么。 如果我将路径存储在字符串而不是数组中,它会很好地工作,但我发现它不那么优雅和方便。

【问题讨论】:

    标签: node.js mongodb sails.js waterline


    【解决方案1】:

    我自己不确定所有 Sails / Waterline 部分,因为我从未玩过它。但是由于错误,问题是您的数组字段上有一个 unique 索引。

    当您插入第二个文档时,您已经在另一个文档的路径字段中有一个值(父级)。唯一约束不允许这样做。最肯定的是,对于您正在建模的内容,您不希望这样,并且索引不能是唯一的。

    我希望您自己设置它,假设它在文档中包含的数组中是唯一的。如果您这样做了,那么您现在就知道该去哪里寻找和改变什么。如果这是以某种方式自动部署的,那么我不会提供帮助。

    将索引更改为不唯一。您可以通过 mongo shell 确认这一点:

    use cms-project
    db.item.getIndices()
    

    祝你好运

    【讨论】:

    • 感谢您的回答,它帮助我解决了我的问题!我对这个集合进行了几次测试,实际上仍然存在对“路径”属性的唯一约束,即使我从 Sails.js 模型中删除了它。
    猜你喜欢
    • 2020-09-29
    • 2014-04-16
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多