Nik*_*hil 14 database indexing mongodb
我想将唯一索引添加到字段中,忽略唯一索引字段中的空值,并忽略基于partialFilterExpression过滤的文档.
问题是稀疏索引不能与Partial索引一起使用.
此外,添加唯一索引会将空值添加到索引键字段,因此无法根据PartialFilterExpression中的$ exist条件忽略文档.
是否有可能在MongoDB 3.2中解决这种情况?
myt*_*der 31
我正在寻找一个解决方案而没有找到一个解决方案,我正在添加这个答案.这可能无法回答这个问题或者可能是,但会像我一样帮助很多其他人.
例.如果字段为nullis houseName且类型为string,则解决方案可以是这样的
db.collectionName.createIndex(
{name: 1, houseName: 1},
{unique: true, partialFilterExpression: {houseName: {$type: "string"}}}
);
Run Code Online (Sandbox Code Playgroud)
这将忽略null字段中的值houseName并仍然是唯一的.
这是我根据mongoDB 部分索引文档修改的示例:
db.contacts.createIndex(
{ email: 1 },
{ unique: true, partialFilterExpression: { email: { $exists: true } } }
)
Run Code Online (Sandbox Code Playgroud)
重要的
要使用部分索引,查询必须包含过滤表达式(或指定过滤表达式子集的修改过滤表达式)作为其查询条件的一部分。
您可以看到诸如以下的查询:
db.contacts.find({'email':'name@email.com'}).explain()
Run Code Online (Sandbox Code Playgroud)
将表明他们正在执行索引扫描,即使您没有指定,{$exists: true}因为您通过在过滤器中指定电子邮件来隐式指定partialFilterExpression的子集。
另一方面,以下查询将执行集合扫描:
db.contacts.find({email: {$exists: false}})
Run Code Online (Sandbox Code Playgroud)
警告
Mythicalcoder 的答案(目前投票最高的答案)非常具有误导性,因为它成功创建了唯一索引,但查询规划器通常无法使用您创建的索引,除非您将其添加到houseName: {$type: "string"}过滤器表达式中。这可能会产生您可能没有意识到的性能成本,并且可能会在以后引起问题。
是的,您可以在MongoDB 3.2中创建部分索引
请参阅https://docs.mongodb.org/manual/core/index-partial/#index-type-partial
MongoDB建议使用部分索引而不是稀疏索引。我建议您放弃稀疏索引,转而使用部分索引。
小智 5
您可以在 mongo:3.2 中创建部分索引。例如,如果 ipaddress 可以是“”,但“127.0.0.1”应该是唯一的。解决方案可以是这样的:
db.collectionName.createIndex(
{"ipaddress":1},
{"unique":true, "partialIndexExpression":{"ipaddress":{"$gt":""}}})
Run Code Online (Sandbox Code Playgroud)
这将忽略 ipaddress 中的 "" 值并且仍然是唯一的
| 归档时间: |
|
| 查看次数: |
7039 次 |
| 最近记录: |