2013-03-11 14 views
11

Supponendo di avere un'istanza MongoDB con 2 raccolte - posti e persone.Come posso convalidare i DBRef in una raccolta MongoDB?

Un tipico luoghi documento si presenta come:

{ 
    "_id": "someID" 
    "name": "Broadway Center" 
    "url": "bc.example.net" 
} 

E un persone documento si presenta come:

{ 
    "name": "Erin" 
    "place": DBRef("places", "someID") 
    "url": "bc.example.net/Erin" 
} 

Esiste un modo per convalidare le luoghi DBRef di ogni documento nel persone collezione?

+0

Solo con la scelta manualmente i documenti e l'interrogazione per la prossima esistenza collezioni di documenti. – Sammaye

+3

Un po 'fuori tema ma assicurati di aver bisogno di DBRef invece di memorizzare semplicemente un ID documento. DBRef è solo una buona scelta se non si è sicuri in quale database logico si riferisca il documento. Entrambe le opzioni richiedono l'interrogazione manuale per il documento di riferimento (anche se alcune librerie di livello superiore lo faranno per te). –

+0

Grazie per il suggerimento; I DBRef sono richiesti di fatto. – noamt

risposta

10

C'è il senza metodo ufficiale/incorporato per verificare la validità di DBRefs, quindi la convalida deve essere eseguita manualmente.

ho scritto un piccolo script - validateDBRefs.js:

var returnIdFunc = function(doc) { return doc._id; }; 

var allPlaceIds = db.places.find({}, {_id: 1}).map(returnIdFunc); 

var peopleWithInvalidRefs = db.people.find({"place.$id": {$nin: allPlaceIds}}).map(returnIdFunc); 

print("Found the following documents with invalid DBRefs"); 
var length = peopleWithInvalidRefs.length; 
for (var i = 0; i < length; i++) { 
    print(peopleWithInvalidRefs[i]); 
} 


Che quando eseguito con:

mongo DB_NAME validateDBRefs.js


Will uscita:

ha fornito i seguenti documenti con DBRefs non validi

513c4c25589446268f62f487

513c4c26589446268f62f48a

1

è possibile aggiungere una funzione memorizzata per quello. si prega di notare che la documentazione di mongo scoraggia l'uso delle funzioni memorizzate. Si può leggere su di esso here

In sostanza si crea una funzione:

db.system.js.save(
    { 
    _id : "myAddFunction" , 
    value : function (x, y){ return x + y; } 
    } 
); 

e una volta che si crea la funzione che si può usare nel vostro clausole WHERE. Quindi potresti scrivere una funzione che controlla l'esistenza dell'ID nel dbRef.

+0

Grazie per il suggerimento. Perché è un'operazione che non verrà eseguita molto spesso, scriverò semplicemente uno script e lo valuterò manualmente. – noamt

Problemi correlati