MongoDB-嵌套文档数组上的唯一复合索引

时间:2020-06-03 12:10:28

标签: mongodb indexing

我有一个复合唯一索引

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}。它是空的...

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

如何解决这个问题,并且有多个空的“单元”数组?

1 个答案:

答案 0 :(得分:0)

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

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