-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Description
Describe the bug
The CreateIndex command fails with an error when the $in operator is used within the partialFilterExpression clause. The failure occurs specifically when attempting to create an index with a partial filter expression that includes a field with $in: [ "" ]. Replacing $in with $eq for the same field succeeds as expected.
Reproduction Steps
Run the following command (with all identifiers obfuscated for privacy):
// Fails
collectionRef.createIndex({
propA: 1,
propB: 1,
propC: 1,
propD: 1,
propE: 1,
propF: 1,
'propG.propH': 1
}, {
name: 'index_alpha_xyz',
partialFilterExpression: {
propA: 'TRUE',
propB: 'CC0',
propC: { '$in': [ '' ] },
propD: [],
propE: 'SOME_TYPE',
propF: { '$exists': true }
}
})Output:
MongoServerError[CannotCreateIndex]: Error in specification { "name": "index_alpha_xyz", "partialFilterExpression": { "propA": "TRUE", "propB": "CC0", "propC": { "$in": [ "" ] }, "propD": [ ], "propE": "SOME_TYPE", "propF": { "$exists": true } }, "key": { "propA": 1, "propB": 1, "propC": 1, "propD": 1, "propE": 1, "propF": 1, "propG.propH": 1 } }:Expression not supported in partial index: propC $in [ "" ]
Running the same command with $eq works:
// Success
collectionRef.createIndex({
propA: 1,
propB: 1,
propC: 1,
propD: 1,
propE: 1,
propF: 1,
'propG.propH': 1
}, {
name: 'index_alpha_xyz',
partialFilterExpression: {
propA: 'TRUE',
propB: 'CC0',
propC: '',
propD: [],
propE: 'SOME_TYPE',
propF: { '$exists': true }
}
})
collectionRef.getIndexes()
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{
v: 2,
key: {
propA: 1,
propB: 1,
propC: 1,
propD: 1,
propE: 1,
propF: 1,
'propG.propH': 1
},
name: 'index_alpha_xyz',
partialFilterExpression: { propA: 'TRUE', propB: 'CC0', propC: '' }
}
]Expected behavior
The $in operator in partialFilterExpression should be accepted and work as expected, similar to $eq. If $in: [ '' ] is not supported, this should be explicitly documented with an appropriate error message upfront.
Actual behavior
Attempting to use $in: [ "" ] for a property in partialFilterExpression results in an error, while $eq succeeds for the same property and value.
Additional context
The issue was discovered when migrating filter index logic from an application. Explicit handling for $in would allow a broader range of filter expressions and assist in migration scenarios.
Originally posted by @sivethe in documentdb/documentdb#434