首页 > 解决方案 > MongoDB - 嵌套文档数组上的唯一复合索引

问题描述

我有一个复合唯一索引

db.collection("sheets").createIndex(
    {
        'cells.x': 1,
        'cells.y': 1
    },
    { unique: true }
);

所以我可以有这样的文件:

{
    _id: "xxx",
    name: "sheet 1",
    cells: [{x:0, y:1, sheet_id: "xxx"}, {x:1, y:1, sheet_id: "xxx"}]
}

但是当我使用空的“单元格”数组字段创建2 个文档时,出现此错误:

(node:23492) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: test.sheets index: cells.x_1_cells.y_1_cells.sheet_id_1 dup key: { cells.x: null, cells.y: null, cells.sheet_id: null }

注意:

复制键:{ cells.x:null,cells.y:null,cells.sheet_id:null}

当然,我在数组中没有 { cells.x: null, cells.y: null, cells.sheet_id: null }。它是空的……

如果一个文档中的“单元格”数组不为空,我可以创建一个包含空“单元格”的第二个文档。

我该如何解决这个问题并拥有多个空的“单元格”数组?

标签: mongodbindexing

解决方案


您可以创建一个Partial Index仅索引与其查询匹配的文档。在这种情况下,仅匹配具有“cell.x”的文档 - 有效地表示具有某些元素的文档。

  db.sheets.createIndex({ "cells.x": 1, "cells.y": 1 }, 
    { unique: true, partialFilterExpression: { "cells.x": { $exists: true } } })

推荐阅读