I am trying to create a index with schema
{
_id: "",
name: ""
}
I want to make an index that supports names with unique values and permits adding data to databases when names have the value "" (empty string).
I tried using this:
db.collection.createIndex(
{name: 1},
{unique: true, partialFilterExpression: {name: {$type: "string"}}}
)
CodePudding user response:
An empty string "" is still a string, so partialFilterExpression: {name: {$type: "string"}} will index this document.
In principle, it would be this one:
db.collection.createIndex(
{name: 1},
{unique: true, partialFilterExpression: {name: {$ne: ""}}}
)
However, partialFilterExpression supports only these operators:
- equality expressions (i.e. field: value or using the
$eqoperator), $exists: true expression,$gt,$gte,$lt,$lteexpressions,$typeexpressions,$andoperator,$oroperator,$inoperator
Looks like, this is not possible. Only way would be to skip the attribute and use { partialFilterExpression: { name: { $exists: true } } }
CodePudding user response:
You can use the string sort ordering to skip the empty string.
Have the partial filter require that name be type string and greater than "":
partialFilterExpression: {$and: [
{name: {$type: "string"}},
{name: {$gt: ""}}
]}
