Come indicizzare gli attributi dinamici in MongoDB


8

Ho i seguenti tipi di dati (un po 'semplificati dal mio caso reale) in MongoDB:

{
    "name":"some name",
    "attrs":[
        {"n":"subject","v":"Some subject"},
        {"n":"description","v":"Some great description"},
        {"n":"comments","v":"Comments are here!"},
        ]
}

L'array attrs è un contenitore per attributi dinamici, cioè non so in anticipo quale tipo di attributi vengono messi lì. n sta per nome e v sta per valore.

Il libro MongoDB In Action lo descrive come una soluzione per avere attributi dinamici nel caso in cui gli attributi siano completamente ridimensionabili. Descrive inoltre che è possibile indicizzarlo in questo modo:

db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})

Le query possono quindi essere eseguite in questo modo:

db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})

Quando provo questo, ottengo prestazioni molto scarse. Ho provato con mycollection con 2 milioni di documenti e non avere un indice che sembra funzionare meglio.

Quindi, la domanda è: c'è un modo per indicizzare questo tipo di impostazione dinamica degli attributi in modo che l'indicizzazione offra buone prestazioni? Nel mio caso, non è possibile avere solo chiavi come "soggetto" e "descrizione" e indicizzarle tutte ...

Risposte:


5

Ho anche posto la stessa domanda (in forma un po 'estesa) sulla mailing list dell'utente mongodb , dove ho ricevuto una risposta. Leggi da lì per ottenere maggiori dettagli. La risposta breve è che la strategia usata nella domanda dovrebbe funzionare bene, ma c'è un problema che la rende molto inefficiente. Speriamo che il problema venga risolto presto.

Nel mio caso, ho solo bisogno di cercare corrispondenze esatte per la tupla {n, v}, quindi posso creare un indice multikey:

db.mycollection.ensureIndex({"attrs":1})

e li fanno interrogare in questo modo:

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

che funziona benissimo e utilizza l'indice in modo molto efficace.


0

La stessa domanda è stata posta qui . A partire dalla versione 4.2 di MongoDB, hanno annunciato indici jolly. Ecco un esempio:

db.myCollection.createIndex( { "subdocument.$**": 1 } );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.