2010-07-25 22 views
-1

Ceci est mon Table:diverses requêtes - MongoDB

unicorns = {'name':'George', 
      'actions':[{'action':'jump', 'time':123123}, 
         {'action':'run', 'time':345345}, 
         ...]} 

Comment puis-je effectuer les requêtes suivantes?

  • Prenez le temps de toutes les actions de tous les licornes où l'action == 'jump'?

  • Prenez toutes les actions de tous les licornes où le temps est égal?

    par exemple. { 'Action': 'sauter', 'temps': 123} et { 'action': 'Stomp', 'time': 123}


aide serait étonnant =)

Répondre

2

Pour la deuxième requête, vous devez utiliser MapReduce, qui peut obtenir un gros poilu. Cela fonctionne:

map = function() { 
    for (var i = 0, j = this.actions.length; i < j; i++) { 
     emit(this.actions[i].time, this.actions[i].action); 
    } 
} 
reduce = function(key, value_array) { 
    var array = []; 
    for (var i = 0, j = value_array.length; i < j; i++) { 
     if (value_array[i]['actions']) { 
      array = array.concat(value_array[i]['actions']); 
     } else { 
      array.push(value_array[i]); 
     } 
    } 
    return ({ actions: array }); 
} 

res = db.test.mapReduce(map, reduce) 
db[res.result].find() 

Cela retourne quelque chose comme ça, où les _id clés sont vos horodatages:

{ "_id" : 123, "value" : { "actions" : [ "jump" ] } } 
{ "_id" : 125, "value" : { "actions" : [ "neigh", "canter" ] } } 
{ "_id" : 127, "value" : { "actions" : [ "whinny" ] } } 

Malheureusement, mongo ne prend pas en charge retourne un tableau d'une diminution de la fonction, ainsi ce qui nécessite la syntaxe {actions: [...]} stupide.

+0

woah merci Emily! Merci de me pointer dans cette direction, et merci pour cette fonction MapReduce !! Je suis dessus maintenant !! =) – RadiantHex

2

notation utilisation séparés par des points:

db.unicorns.find({'actions.action' : 'jump'}) 

de même pour les temps:

db.unicorns.find({'actions.time' : 123}) 

Edit: si vous voulez pour grouper les résultats par le temps, vous devrez utiliser MapReduce.

+1

la seconde requête semble choisir tous les licornes avec 'action.time == 123'. Je peux me tromper ici, mais j'ai compris que la question portait sur le résultat comme {12345: [{'action': 'jump', 'time': 12345}, {'action': 'stomp', 'temps': 12345}], 12390: [{'action': 'jump', 'time': 12390}, {'action': 'run', 'time': 12390}]} '... mais peut-être que je me trompe :) – viraptor

+0

merci pour la réponse !! =) Pour la deuxième requête, je demandais plus de regrouper les actions par le temps, je devrais mieux m'exprimer. Merci encore! – RadiantHex