J'ai une collection de widgets qui comporte des enregistrements comme celui-ci:
{ "_id" : ObjectId("55a6abe193819c033d4d755a"), "name" : "widget1"}
{ "_id" : ObjectId("55a6abe193819c033d4d755a"), "name" : "widget2", "loc" : ObjectId("55a69475da314d9984fc6201") }
J'ai aussi une collection d'emplacements qui ressemble à ceci:
{ "_id" : ObjectId("55a69475da314d9984fc6201"), "abbrev" : "CAN", "description" : "Canada" }
{ "_id" : ObjectId("55a6948eda314d9984fc6202"), "abbrev" : "USA", "description" : "United States" }
{ "_id" : ObjectId("55a69496da314d9984fc6203"), "abbrev" : "MEX", "description" : "Mexico" }
Si je veux trouver tous les widgets situés au Canada, en utilisant l'ObjectId, je sais que je peux le faire:
> db.widgets.find( { loc: ObjectId("55a69475da314d9984fc6201")})
{ "_id" : ObjectId("55a6abe193819c033d4d755a"), "name" : "widget2", "loc" : ObjectId("55a69475da314d9984fc6201") }
Mais que si je souhaite rechercher des emplacements n'utilise pas l'objectif, mais l'abréviation ou la description? Comment ferais-je cela?
Pour interroger deux collections avec des données connexes, l'approche commune (comme chez MongoDb 3.0) consiste à trouver une liste de correspondance _id
valeurs de la première collection qui peut être utilisée avec un $in
Requête sur la seconde.
Voici un exemple utilisant le mongo
shell:
// Find _ids for matching locations based on some criteria (eg. "abbrev")
var matches = db.locations.find({ "abbrev": "CAN"}, { _id: 1 })
// Transform matching _id values into an array
var locs = [];
matches.forEach(function(match) { locs.Push(match._id) });
// Look for widgets matching the location criteria
db.widgets.find({"loc": {$in : locs} } )
Selon le conducteur et/ou le cadre que vous utilisez, il peut y avoir des fonctions d'assistance pour faciliter la population de données connexes. Ces fonctions d'assistant entraîneront finalement plusieurs requêtes car il n'y a actuellement aucun support sur le côté serveur pour les jointures.
Quelques exemples de cadres avec des assistants (non destinés à être une liste complète):
mongo
shell interactif ajout de support pour des vues requéres/collections virtuellesVous pouvez noter que j'ai dit qu'il n'y a actuellement aucun support côté serveur pour la population de données. Il y a en fait un nouveau $lookup
Opérateur ajouté au cadre d'agrégation dans le cycle de développement de MongoDB 3.1.x (qui aboutira à la série éventuelle de la version de production pour MongoDB 3.2). Pour plus d'informations, voir: Server-19095 dans le tracker d'émission de MongoDB JIRA.