mongodb - 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 }。它是空的……
如果一个文档中的“单元格”数组不为空,我可以创建一个包含空“单元格”的第二个文档。
我该如何解决这个问题并拥有多个空的“单元格”数组?
解决方案
您可以创建一个Partial Index
仅索引与其查询匹配的文档。在这种情况下,仅匹配具有“cell.x”的文档 - 有效地表示具有某些元素的文档。
db.sheets.createIndex({ "cells.x": 1, "cells.y": 1 },
{ unique: true, partialFilterExpression: { "cells.x": { $exists: true } } })
推荐阅读
- c - 现代 x64 系统上的指针内部是什么?
- graph - 如何在 azure 函数中使用 GraphClient 添加内容类型的共享点列表项
- linear-programming - 如何将 PySCIPOpt 模型的解决方案复制到另一个模型?
- java - 如何在游戏中添加按钮以使两者都可见?
- c# - 将 URL 文档下载到文件夹
- python - HTTP 错误 400 使用 python 调用 api 的错误请求
- ruby - 使用 Ruby IO 混合输入/输出?
- python - use_avro_logical_types 参数听起来被忽略(至少对于日期)
- python - 结果很差 Word2Vec
- php - 在带有 PHP7.4 的 Ubuntu 18.04 上的 Moodle 设置上出现 MySQLi 错误