MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Schema preferito di MongoDB per le raccolte incorporate. documenti vs array

Nel tuo primo approccio non puoi indicizzare i campi id, poiché id utilizzato come chiave. È un po' come un dizionario dei valori chiave. Questo approccio è utile se hai l'insieme noto di id (ovviamente meno numero). Supponi che nel tuo primo esempio l'id sia ben noto a fronte ,

>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

quindi per trovare i valori per il campo id idk73716, puoi farlo con

 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

il vuoto {} indica la query e la seconda parte {'lines.idk73716':1} è un selettore di query.

avere ID come chiavi con il vantaggio di selezionare solo il campo particolare. Anche se {'lines.idk73716':1} è un selettore di campo, qui funge da query e selettore. ma questo non può essere fatto nel tuo secondo approccio. Supponiamo che la seconda raccolta sia più o meno così

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

E hai indicizzato l'id del campo, quindi se vuoi eseguire una query per id

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

vedendo l'output sopra, è visibile che non c'è modo di selezionare da soli i documenti sub(embedded) corrispondenti, ma è possibile nel primo approccio. Questo è il comportamento predefinito di mongodb.

vedi

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

recupererà tutte le righe, non solo idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Spero che questo aiuti

MODIFICA

Grazie a @Gates VP per segnalare

Possiamo ancora usare $exists per interrogare l'id, ma non sarà indicizzabile