English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Riferimento database MongoDB

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.

DBRef rispetto a riferimenti manuali

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.

Uso di DBRef

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 DBRefaddressCome 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_homeI documenti di indirizzo esistenti nella collezione sono i seguenti-

{
   "_id": ObjectId("534009e4d852427820000002"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}