La documentazione è abbastanza chiara nella sezione del manuale a cui ti riferisci, che è la sezione su Riferimenti al database . La parte più importante per comprenderlo è contenuta nella dichiarazione di apertura nella pagina:
Le ulteriori informazioni riguardano l'argomento di come potresti scegli di occuparti dell'accesso ai dati che memorizzi in un'altra raccolta.
C'è il DBRef specifica che, senza entrare troppo in dettaglio, può essere implementato in alcuni driver in modo che, quando questi vengono trovati nei tuoi documenti, recupereranno (espanderanno) automaticamente il documento di riferimento nel documento corrente. Questo verrebbe implementato "dietro le quinte" con un'altra query a quella raccolta per il documento di quel _id.
Nel caso di Riferimenti manuali questo sta fondamentalmente dicendo che c'è semplicemente un campo nel tuo documento che ha come contenuto l'ObjectId da un altro documento. Questo differisce dal DBRef solo come qualcosa che mai essere elaborato da un'implementazione di base del driver lascia a te come gestire qualsiasi ulteriore recupero di quell'altro documento.
Nel caso di:
> db.collection.findOne()
{
_id: <ObjectId>,
name: "This",
something: "Else",
ref: <AnotherObjectId>
}
Il ref
campo nel documento non è altro che un semplice ObjectId e non fa nulla di speciale. Ciò che ti consente di fare è inviare la tua query per ottenere i dettagli dell'oggetto a cui si riferisce:
> db.othercollection.findOne({ _id: <AnotherObjectId > })
{
_id: <ObjectId>
name: "That"
something: "I am a sub-document to This!"
}
Tieni presente che tutti questi processi vengono eseguiti sul lato client tramite l'API del driver. In ogni caso, sul server non avviene nulla di tutto questo il recupero di altri documenti.