2010-07-25 79 views
-1

這是我各種查詢 - MongoDB的

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

我如何可以執行以下查詢?

  • 拿好時所有獨角獸的所有動作,其中行動== '跳'

  • 所有獨角獸其中時間等於的所有動作?

    例如{ '動作': '跳轉', '時間':123}和{ '動作': '蹬', '時間':123}


幫助將是驚人=)

回答

2

對於第二個查詢,您需要使用MapReduce,它可以得到一個大毛茸茸的。這將工作:

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

這將返回這樣的事情,在_id鍵是你的時間戳:

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

不幸的是,蒙戈目前不支持從減少函數返回一個數組,從而需要愚蠢的{actions: [...]}語法。

+0

哇,謝謝Emily!感謝您指點我這個方向,並感謝MapReduce功能!我現在就在上面! =) – RadiantHex 2010-07-26 21:59:04

2

用點分隔的表示法:

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

同樣的時間:

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

編輯:如果你想按時間分組結果,您必須使用MapReduce

+1

第二個查詢似乎用'action.time == 123'選擇所有獨角獸。我可能在這裏是錯誤的,但我理解這個問題是關於結果如{12345:[{'action':'jump','time':12345},{'action':'stomp','time': 12390}],12390:[{'action':'jump','time':12390},{'action':'run','time':12390}]} ...但也許我錯了:) – viraptor 2010-07-26 01:37:21

+0

感謝您的答覆! =)對於第二個查詢,我更多地要求按時間分組,更好地表達自己。再次感謝! – RadiantHex 2010-07-26 09:01:00