2013-03-11 4 views
11

En supposant que j'ai une instance MongoDB avec 2 collections - places et personnes.Comment puis-je valider DBRefs dans une collection MongoDB?

A typiques endroits documents ressemble:

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

Et un gens documents ressemble:

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

Est-il possible de valider les lieux DBRef de tous les document dans les personnes collection?

+0

uniquement en sélectionnant manuellement les documents et l'interrogation pour la prochaine collections documents existance. – Sammaye

+3

Un peu hors sujet, mais assurez-vous que vous avez besoin de DBRef plutôt que de simplement stocker un ID de document. DBRef est seulement un bon choix si vous n'êtes pas sûr de la base de données logique à laquelle le document est référé. Les deux options nécessitent une interrogation manuelle pour le document référencé (bien que certaines bibliothèques de niveau supérieur le fassent pour vous). –

+0

Merci pour le conseil; DBRefs sont en fait requis. – noamt

Répondre

10

Aucune méthode officielle/intégrée pour tester la validité de DBRefs, la validation doit donc être effectuée manuellement.

J'ai écrit un petit 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]); 
} 


que lorsqu'il est exécuté avec:

mongo DB_NAME validateDBRefs.js


Will sortie:

trouvé les documents suivants DBREFS invalides

513c4c25589446268f62f487

513c4c26589446268f62f48a

1

vous pouvez ajouter une fonction stockée pour cela. Veuillez noter que la documentation de mongo décourage l'utilisation des fonctions stockées. Vous pouvez lire à ce sujet here

Essentiellement vous créez une fonction:

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

et une fois que la fonction est créée, vous pouvez l'utiliser dans vos clauses where. Vous pouvez donc écrire une fonction qui vérifie l'existence de l'ID dans le dbRef.

+0

Merci pour la suggestion. Parce que c'est une opération qui ne sera pas exécutée très souvent, je vais écrire un script et l'évaluer manuellement. – noamt

Questions connexes