arrays - Mongo 嵌套数组和(部分)唯一索引
问题描述
我正在使用 MongoDB v3.2。我在一个集合中有以下形式的对象:
{
...
root_array: [
{
...
child_array: [
{
id: 'some-uuid'
}
]
...
},
{
...
child_array: [
{
id: 'some-other-uuid'
}
]
...
}
{
...
child_array: [
// possibly empty
]
...
}
]
...
}
我想在这个集合上有一个唯一索引,它强制执行这样的约束:在整个集合中,没有 child_array 元素对象具有相同的 id 字段值。我想简单地说的方式是:
collection.createIndex({
'root_array.child_array.id': 1
}, {
unique: true
});
...实际上可以完成这项工作,除了并非所有 child_arrays 都是非空的事实。因此,两个退化对象(具有空的一元素 root_arrays,包含零元素 child_array)导致违反约束。这通常会导致我尝试指定一个 partialFilterExpression 来放松约束。但是,在这种情况下,我看不到这样做的方法。我想要说明的表达式看起来像这样:
collection.createIndex({
'root_array.child_array.id': 1
}, {
unique: true,
partialFilterExpression: {
'root_array.child_array': {$gt: ''}
}
});
...但这似乎也是错误的,因为以下两个对象同样会导致违反约束:
{ root_array: [ { child_array: [ { id: 1 } ] }, { child_array: [] } ] }
{ root_array: [ { child_array: [ { id: 2 } ] }, { child_array: [] } ] }
...因为两个元素都满足 partialFilterExpression 并且两个文档都有一个没有元素的 child_array(因此它们的一个孩子的未定义 id)。
将其指定为数据库约束是否难以处理,是否必须将其作为应用程序级问题处理?或者有什么方法可以在不从根本上改变相关文档的结构的情况下,在数据库中获取我所说的内容?
解决方案
推荐阅读
- javascript - JavaScript 中是否有任何内置方法来查找数字的阶乘?
- angular - 如何以角度验证可编辑内容 td?
- mongodb - Mongodump 不适用于新的 Meteor 1.8
- multithreading - 多线程二分搜索
- c# - 当我以 xamarin 表单旋转内容页面时,我想将控件(图表)设置为适合屏幕
- javascript - 反应页面不从顶部呈现
- wordpress - 无法使用 Elementor 编辑 Wordpress 网站(“更新失败”)
- javascript - 与 async.parallel 斗争
- oracle11g - 无法访问表空间的 Oracle 用户是否可以将值插入到放置在该表空间中的表中?
- php - 如何在laravel中存储多个关系