MongoDB - Riferimenti a database
Come visto nell'ultimo capitolo delle relazioni di MongoDB, per implementare una struttura di database normalizzata in MongoDB, usiamo il concetto di Referenced Relationships indicato anche come Manual Referencesin cui archiviamo manualmente l'ID del documento di riferimento all'interno di un altro documento. Tuttavia, nei casi in cui un documento contiene riferimenti da diverse raccolte, possiamo usareMongoDB DBRefs.
DBRefs vs riferimenti manuali
Come scenario di esempio, in cui utilizzeremmo DBRefs invece di riferimenti manuali, consideriamo un database in cui memorizziamo diversi tipi di indirizzi (casa, ufficio, mailing, ecc.) In diverse raccolte (address_home, address_office, address_mailing, ecc.). Ora, quando auserIl documento della raccolta fa riferimento a un indirizzo, è inoltre necessario specificare quale raccolta esaminare in base al tipo di indirizzo. In tali scenari in cui un documento fa riferimento a documenti di molte raccolte, dovremmo usare DBRefs.
Utilizzando DBRefs
Ci sono tre campi in DBRefs:
$ref - Questo campo specifica la raccolta del documento di riferimento
$id - Questo campo specifica il campo _id del documento di riferimento
$db - Questo è un campo opzionale e contiene il nome del database in cui si trova il documento di riferimento
Considera un documento utente di esempio con un campo DBRef address come mostrato nello snippet di codice -
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "tutorialspoint"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
Il address Il campo DBRef qui specifica che si trova il documento dell'indirizzo di riferimento address_home raccolta sotto tutorialspoint database e ha un ID di 534009e4d852427820000002.
Il codice seguente cerca dinamicamente nella raccolta specificata da $ref parametro (address_home nel nostro caso) per un documento con id come specificato da $id parametro in DBRef.
>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
Il codice sopra restituisce il seguente documento di indirizzo presente in address_home raccolta -
{
"_id" : ObjectId("534009e4d852427820000002"),
"building" : "22 A, Indiana Apt",
"pincode" : 123456,
"city" : "Los Angeles",
"state" : "California"
}