English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Come visto nell'ultimo capitolo sui rapporti MongoDB, per implementare una struttura di database normalizzata in MongoDB, abbiamo utilizzato il concetto di relazione di riferimento (noto anche come riferimento manuale), dove memorizziamo manualmente l'id del documento di riferimento negli altri documenti. Tuttavia, quando i documenti contengono riferimenti a diverse collezioni, possiamo utilizzare MongoDB DBRefs.
Come esempio di scenario, consideriamo un database in cui, al posto di utilizzare DBRef, man mano che memorizziamo diversi tipi di indirizzi (casa, ufficio, posta ecc.) in diverse collezioni (address_home, address_office, address_mailing ecc.), quando il documento della collezione user si riferisce all'indirizzo, deve specificare la collezione da cercare in base al tipo di indirizzo. Quando il documento si riferisce a documenti in più collezioni, dovremmo utilizzare DBRefs.
I DBRefs hanno tre campi-
$ref
−Questo campo specifica la collezione del documento di riferimento
$id
−Questo campo specifica il campo _id del documento di riferimento
$db
−Questo è un campo opzionale che contiene il nome del database in cui si trova il documento di riferimento
Consideriamo un documento utente esempio con un campo DBRefaddress
Come mostrato nel frammento di codice -
{ "_id": ObjectId("53402597d852426020000002"), "address": { "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "w3codebox"}, "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin" }
L'indirizzo DBRef del campo specifica che il documento di indirizzo di riferimento si trova nella collezione address_home del database w3codebox, con id 534009e4d8524278200000002.
Il codice seguente cerca dinamicamente il documento con l'id specificato dai parametri $ref (nel nostro esempio address_home) nella collezione specificata dal parametro $id del DBRef.
>var user = db.users.findOne({"name":"Tom Benzamin"}) >var dbRef = user.address >db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
Il codice sopra restituisceaddress_home
I documenti di indirizzo esistenti nella collezione sono i seguenti-
{ "_id": ObjectId("534009e4d852427820000002"), "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }