-1

これは私のテーブルです:

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

次のクエリを実行するにはどうすればよいですか?

  • action =='jump'あるすべてのユニコーンのすべてのアクションの時間を取得しますか?

  • 時間が等しいすべてのユニコーンのすべてのアクションをつかみますか?

    例:{'action':'jump'、'time':123}および{'action':'stomp'、'time':123}


ヘルプは素晴らしいでしょう=)

4

2 に答える 2

2

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" ] } }

残念ながら、mongoは現在、reduce関数から配列を返すことをサポートしていないため、ばかげた{actions: [...]}構文が必要になります。

于 2010-07-26T20:15:15.170 に答える
2

ドット区切り表記を使用します。

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

同様に時のために:

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

編集:結果を時間でグループ化する場合は、MapReduceを使用する必要があります。

于 2010-07-25T23:49:49.360 に答える