2010-08-06 12 views
4

Я пытаюсь выполнить эту команду MongoDB в Node.js:Выполнение запросов MongoDB в Node.js

db.events.group({ 
    key : { 
    'timestamp.d' : true 
    }, 
    cond: { 'event_name': 'search' }, 
    initial : { 
    'count' : 0, 
    'empty' : 0, 
    'redos' : 0 
    }, 
    reduce : function(item, summaries){ 
    summaries.count++; 
    if (item.result_count == 0){ 
     summaries.empty++; 
    } 
    if (item.original_query) { 
     summaries.redos++; 
    } 
    var totalSuccesses = (summaries.count - summaries.redos - summaries.empty); 
    summaries.percentNonFailures = (totalSuccesses/summaries.count) * 100 
    } 
}) 

Это прекрасно работает с командой Монго, как дать мне резюме в день. Когда я пытаюсь это в Node.js:

db.collection('events', function(err, collection){ 
    collection.group(
    { "timestamp.d": true }, 
    { "event_name": "search" }, 
    { 
     count: 0, 
     empty: 0, 
     redos: 0, 
     percentNonFailure: 0, 
    }, 
    function(item, summaries){ 
     summaries.count++; 
     if (item.result_count == 0) { summaries.empty++; } 
     if (item.original_query) { summaries.redos++; } 
     totalSuccesses = summaries.count - summaries.redos - summaries.empty 
     summaries.percentNonFailure = (totalSuccesses/summaries.count) * 100 
    }, 
    function(err, results){ self.eventEmitter.emit(doneEvent, results) } 
); 
}) 

я получаю один результат со всеми итоговыми в день подводились вместе, поэтому в основном суммы счета, пустые, Redos за весь период.

Что делается неправильно при попытке конвертировать запрос в Node.js?

+3

Возможно, я решил проблему, Узел запускает запрос иначе, чем в командной строке, поэтому группировка не группируется хэш-элементом 'd'' timestamp', а 'timestamp.d' – trobrock

+0

Я могу просто улучшить on - это не node.js как таковой, а родной драйвер node-mongodb (https://github.com/christkv/node-mongodb-native). Вы можете проверить, как именно операция была реализована драйвером, просмотрев код. –

ответ

1

У меня была та же проблема. Я довольно подробно разбирался в коде драйвера mongodb.

Проблема заключается в ключах от вспомогательных документов. водитель получает что-то вроде

obj["timestamp.d"] 

, который не является тем, что вы хотите.

То, что я нашел, является аргументом 'command', который решил мою проблему.

db.collection('events', function(err, collection){ 
    collection.group(
    [ "timestamp.d" ], // array element, might also work the old way 
    { "event_name": "search" }, 
    { 
     count: 0, 
     empty: 0, 
     redos: 0, 
     percentNonFailure: 0, 
    }, 
    function(item, summaries){ 
     summaries.count++; 
     if (item.result_count == 0) { summaries.empty++; } 
     if (item.original_query) { summaries.redos++; } 
     totalSuccesses = summaries.count - summaries.redos - summaries.empty 
     summaries.percentNonFailure = (totalSuccesses/summaries.count) * 100 
    }, 
    true, // use the group command 
    function(err, results){ self.eventEmitter.emit(doneEvent, results) } 
); 
}) 

Вы можете увидеть здесь: collection.js от линии 1054 на

-1

Я считаю, что это трудно, чтобы обратиться к Docs API. Поэтому я нахожу их, и вот они:

Here is docs in MongoDB.

и Here - еще.

Смежные вопросы