Различные запросы - MongoDB - PullRequest
0 голосов
/ 25 июля 2010

Это моя таблица :

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

Как выполнить следующие запросы?

  • Хватайте время всех действий всех единорогов , где action == 'jump' ?

  • Схватить все действия всех единорогов , где время равно ?

    например. {'action': 'jump', 'time': 123} и {'action': 'stomp', 'time': 123}


Помощь была бы потрясающей =)

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Для второго запроса вам нужно использовать 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" ] } }

К сожалению, в настоящее время Монго не поддерживает возврат массиваиз функции Reduce, что требует глупого синтаксиса {actions: [...]}.

2 голосов
/ 26 июля 2010

Используйте разделенные точками обозначения:

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

Аналогично для времен:

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

Редактировать: если вы хотите сгруппировать результаты по времени, вам придется использовать MapReduce .

...