Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Un indice parziale indicizza i documenti di una raccolta che soddisfa un criterio di filtro specificato. La funzionalità di indice parziale è supportata nei cluster basati su istanze di Amazon DocumentDB 5.0.
Argomenti
Crea un indice parziale
Per creare un indice parziale, utilizzate il createIndex()
metodo con l'partialFilterExpression
opzione. Ad esempio, l'operazione seguente crea un indice composto univoco nella raccolta orders che indicizza i documenti il cui isDelivered
campo è impostato su true: OrderID
db.orders.createIndex( {"category": 1, "CustomerId": 1, "OrderId": 1}, {"unique": true, "partialFilterExpression": {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]} } )
Operatori supportati
$eq
$exists
$and (solo al livello superiore)
$gt/$gte/$lt/$lte (la scansione dell'indice viene utilizzata solo quando il filtro, previsto nella query, corrisponde esattamente all'espressione parziale del filtro) (vedi Limitazioni)
Interrogazione utilizzando un indice parziale
I seguenti modelli di interrogazione sono possibili utilizzando indici parziali:
-
Il predicato della query corrisponde esattamente all'espressione del filtro dell'indice parziale:
db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}).explain()
-
Il risultato previsto dal filtro di interrogazione è un sottoinsieme logico del filtro parziale:
db.orders.find({"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}}, {"OrderAmount": {"$eq": "5"}} ]}).explain()
-
Un sottopredicato della query può essere utilizzato insieme ad altri indici:
db.orders.createIndex({"anotherIndex":1}) db.orders.find({ "$or": [ {"$and": [ {"OrderId": {"$exists": true}}, {"isDelivered": {"$eq": false}} ]}, {"anotherIndex": {"$eq": 5}} ] }).explain()
Nota
Un pianificatore di query può scegliere di utilizzare una scansione della raccolta anziché una scansione dell'indice se è efficiente farlo. Questo si verifica in genere per raccolte molto piccole o per query che restituirebbero una grande parte di una raccolta.
Funzionalità di indicizzazione parziale
Elenca gli indici parziali
Elenca gli indici parziali utilizzando l'operazione. partialFilterExpression getIndex
Ad esempio, l'getIndex
operazione emessa in elenca gli indici parziali con i campi key, name e partialFilterExpressions:
db.orders.getIndexes()
Questo esempio restituisce il seguente risultato:
[
{
"v" : 4,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "ecommerceApp.orders"
},
{
"v" : 4,
"unique" : true,
"key" : {
"category" : 1,
"" : 1,
"CustomerId" : 1,
"OrderId" : 1
},
"name" : "category_1_CustID_1_OrderId_1",
"ns" : "ecommerceApp.orders",
"partialFilterExpression" : {
"$and" : [
{"OrderId": {"$exists": true}},
{"isDelivered": {"$eq": false}}
]
}
}
]
Espressione di filtro parziale multipla sulla stessa chiave:order
È possibile creare diversi indici parziali per le stesse combinazioni di campi (key:order). Questi indici devono avere un nome diverso.
db.orders.createIndex( {"OrderId":1}, { name:"firstPartialIndex", partialFilterExpression:{"OrderId":{"$exists": true}} } )
db.orders.createIndex( {"OrderId":1}, { name:"secondPartialIndex", partialFilterExpression:{"OrderId":{"$gt": 1000}} } )
Esegui getIndexes
l'operazione per elencare tutti gli indici della raccolta:
db.orders.getIndexes()
Questi esempi restituiscono il seguente risultato:
[
{
"v" : 4,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "ecommerceApp.orders"
},
{
"v" : 4,
"key" : {
"OrderId" : 1
},
"name" : "firstPartialIndex",
"ns" : "ecommerceApp.orders",
"partialFilterExpression" : {"OrderId":{"$exists": true}}
},
{
"v" : 4,
"key" : {
"OrderId" : 1
},
"name" : "secondPartialIndex",
"ns" : "ecommerceApp.orders",
"partialFilterExpression" : {"OrderId":{"$gt": 1000}}
}
]
Importante
I nomi degli indici devono essere diversi e devono essere eliminati solo per nome.
Indici con proprietà parziali e TTL
È inoltre possibile creare indici con proprietà parziali e TTL specificando entrambe le opzioni durante la creazione dell'indice. partialFilterExpression
expireAfterSeconds
Ciò consente di fornire un maggiore controllo su quali documenti vengono ora rimossi da una raccolta.
Ad esempio, potresti avere un indice TTL che identifica i documenti da eliminare dopo un certo periodo di tempo. Ora puoi fornire condizioni aggiuntive su quando eliminare i documenti utilizzando l'opzione di indice parziale:
db.orders.createIndex( { "OrderTimestamp": 1 }, { expireAfterSeconds: 3600 , partialFilterExpression: { "isDelivered": { $eq: true } } } )
Questo esempio restituisce il seguente risultato:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1,
"operationTime" : Timestamp(1234567890, 1)
}
Eseguite l'getIndexes
operazione per elencare gli indici presenti nella raccolta:
db.orders.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.orders" }
Questo esempio restituisce il seguente risultato:
[
{
"v": 4,
"key": {
"_id": 1
},
"name": "_id_",
"ns": "ecommerceApp.orders"
},
{
"v": 4,
"key": {
"OrderTimestamp": 1
},
"name": "OrderTimestamp_1",
"ns": "ecommerceApp.orders",
"partialFilterExpression": {
"isDelivered": {
"$eq": true
}
},
"expireAfterSeconds": 3600
}
]
Limitazioni parziali dell'indice
Le seguenti limitazioni si applicano alla funzionalità di indice parziale:
-
Le query di disuguaglianza in Amazon DocumentDB utilizzeranno un indice parziale solo quando il predicato del filtro di query corrisponde esattamente a ed è
partialFilterExpression
dello stesso tipo di dati.Nota
$hint
Non può essere utilizzato nemmeno per forzare IXSCAN nel caso precedente.Nell'esempio seguente,
partialFilterExpression
viene applicato solofield1
ma nonfield2
a:db.orders.createIndex( {"OrderAmount": 1}, {"partialFilterExpression": { OrderAmount : {"$gt" : 5}}} ) db.orders.find({OrderAmount : {"$gt" : 5}}) // Will use partial index db.orders.find({OrderAmount : {"$gt" : 6}}) // Will not use partial index db.orders.find({OrderAmount : {"$gt" : Decimal128(5.00)}}) // Will not use partial index
-
Gli operatori A
partialFilterExpression
con array non sono supportati. La seguente operazione genererà un errore:db.orders.createIndex( {"CustomerId":1}, {'partialFilterExpression': {'OrderId': {'$eq': [1000, 1001, 1002]}}} )
I seguenti operatori non sono supportati nel partialFilterExpression campo:
$all
(operatore di matrice)$mod
(operatore di matrice)$or
$xor
$not
$nor
Il tipo di dati dell'espressione del filtro e del filtro devono essere gli stessi.