2012-03-27 3 views
1

Je suis l'entité suivante persistaient sur mongo dans une collection users:MongoDB et requête complexe sur les tableaux commandés

{ 
    "fullname": "Luke Tomson", 
    "nicknames": [ 
     { 
      "name": "lukeone", 
      "created": ISODate("2011-05-18T19:42:56.411Z") 
     }, 
     { 
      "name": "magicluke", 
      "created": ISODate("2012-01-12T19: 42: 56.411Z") 
     }, 
     { 
      "name": "superluke", 
      "created": ISODate("2012-03-27T19: 42: 56.411Z") 
     } 
    } 
] 
} 

Comment puis-je obtenir la dernière surnom name pour un utilisateur dont fullname est "Luke Tomson"? Et plus précisément, comment puis-je récupérer dans le shell mongo un index spécifique (le premier ou le dernier) d'un tableau trié qui a été trié sur un champ spécifique (dans ce cas, created).

Merci

Répondre

1

From the documentation, le second objet est passé à un .find est une sélection de ce que les parties de l'objet que vous souhaitez renvoyer.

Donc, ce que vous voulez est essentiellement:

db.users.find({"fullname": "Luke Tomson"}, {"nicknames": { $slice: -1 } }); 

Bien que vous pouvez également retourner le _id s'il y a plusieurs « Luc Tomson » s dans votre DB et vous avez besoin de les identifier de manière unique.

+0

Et y at-il un moyen de récupérer réellement l'utilisateur dont le dernier surnom est "superluke"? – Mark

+0

Si vous interrogez un élément de tableau avec une valeur non-tableau, il retournera tous les enregistrements où au moins l'un des enregistrements contient la valeur spécifiée. Si vous n'avez vraiment besoin que des enregistrements où '' superluke'' est le dernier surnom, alors vous pouvez revenir à la requête de style table-scan '' $ where''. La chaîne que vous passez à '' $ where'' devrait être une seule instruction Javascript qui évalue à un booléen et '' this'' est un seul enregistrement MongoDB. '' db.users.find ({$ where: "this.nicknames [this.nicknames.length-1] .name == 'superluke'"}) ''. Vous pourrez peut-être chaîner '' find'' pour réduire la taille de l'analyse. –

+0

Oh, en passant, [cette page est votre ami] (http://www.mongodb.org/display/DOCS/Advanced+Queries). C'est très dense, mais j'ai tout ce que je sais sur MongoDB de cette page ou de l'autre que j'ai lié à vous. (Et l'expérience de lecture avec la bibliothèque node-mongodb-native.) –