web-dev-qa-db-fra.com

MongoDB: Interrogation pour un document qui a une référence d'objet

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?

3
dot

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):

  • Mongoosejs: Population de requêtes : Node.js Modèle d'objet-Document (ODM), y compris la population de schéma et de requête déclarative pour les relations
  • Mongoïde: relations : Ruby ODM, y compris la population de schéma et de requête déclarative pour les relations
  • Mongo-Vues : Complémentation expérimentale pour le mongo shell interactif ajout de support pour des vues requéres/collections virtuelles

Vous 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.

6
Stennie