Índices curinga em um único campo suportam consultas em qualquer subcampo do campo indexado. Use índices curinga para dar suporte a queries sobre nomes de campo que você não conhece com antecedência ou que variam entre documentos.
Para criar um índice curinga em um único campo, utilize o método db.collection.createIndex() e inclua o especificador curinga ($**) na chave do índice:
db.collection.createIndex( { "<field>.$**": <sortOrder> } )
Sobre esta tarefa
Utilize índices curinga somente quando os campos que você deseja indexar forem desconhecidos ou possam mudar. Os índices curinga não funcionam tão bem quanto os índices direcionados em campos específicos. Se sua collection contiver nomes de campos arbitrários que impeçam índices direcionados, considere remodelar seu esquema para ter nomes de campos consistentes. Para saber mais sobre índices direcionados, consulte Crie índices para oferecer suporte a queries.
Antes de começar
Crie uma coleção de products que contenha os seguintes documentos:
db.products.insertMany( [ { "product_name" : "Spy Coat", "attributes" : { "material" : [ "Tweed", "Wool", "Leather" ], "size" : { "length" : 72, "units" : "inches" } } }, { "product_name" : "Spy Pen", "attributes" : { "colors" : [ "Blue", "Black" ], "secret_feature" : { "name" : "laser", "power" : "1000", "units" : "watts", } } } ] )
Procedimento
A seguinte operação cria um índice curinga no campo attributes :
db.products.createIndex( { "attributes.$**" : 1 } )
Resultados
O índice curinga suporta queries de campo único no attributes ou seus campos incorporados. Por exemplo, o índice suporta as seguintes queries:
Query:
db.products.find( { "attributes.size.length" : { $gt : 60 } } ) Saída:
[ { _id: ObjectId("63472196b1fac2ee2e957ef6"), product_name: 'Spy Coat', attributes: { material: [ 'Tweed', 'Wool', 'Leather' ], size: { length: 72, units: 'inches' } } } ] Query:
db.products.find( { "attributes.material" : "Leather" } ) Saída:
[ { _id: ObjectId("63472196b1fac2ee2e957ef6"), product_name: 'Spy Coat', attributes: { material: [ 'Tweed', 'Wool', 'Leather' ], size: { length: 72, units: 'inches' } } } ] Query:
db.products.find( { "attributes.secret_feature.name" : "laser" }, { "_id": 0, "product_name": 1, "attributes.colors": 1 } ) Saída:
[ { product_name: 'Spy Pen', attributes: { colors: [ 'Blue', 'Black' ] } } ]
Os índices curinga têm um comportamento específico quando o campo indexado contém um objeto incorporado (por exemplo, attributes.secret_feature). Para obter mais informações, consulte Índices curinga em objetos e arrays incorporados.
Saiba mais
Para saber mais sobre comportamentos e casos de uso de índices curinga, consulte: