2010-08-06 3 views
4

Je suis en train d'exécuter cette commande MongoDB dans Node.js:exécution requête MongoDB dans 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 
    } 
}) 

Cela fonctionne très bien de la commande Mongo comme me donner des résumés par jour. Lorsque je tente cela dans 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) } 
); 
}) 

-je obtenir un seul résultat avec tous les totaux par jour ensemble, résume donc en gros une somme de comptage, vides, ODER pour toute la période.

Que se passe-t-il de mal à essayer de convertir la requête à utiliser dans Node.js?

+3

J'ai peut-être résolu le problème, Node exécute la requête différemment de la ligne de commande, donc le regroupement n'est pas groupé par l'élément de hachage 'd' de' timestamp' mais par 'timestamp.d' – trobrock

+0

upon - ce n'est pas node.js en soi, mais, pilote natif-mongodb-native (https://github.com/christkv/node-mongodb-native). Vous pouvez vérifier comment exactement l'opération a été implémentée par le pilote en parcourant le code. –

Répondre

1

J'ai eu le même problème. J'ai beaucoup exploré le code du driver mongodb.

Le problème provient des sous-documents. le conducteur se retrouve avec quelque chose comme

obj["timestamp.d"] 

ce qui n'est pas ce que vous voulez.

Ce que j'ai trouvé est un argument 'command' qui a résolu mon problème.

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) } 
); 
}) 

Vous pouvez le voir ici: collection.js de la ligne 1054 sur

-1

Je trouve qu'il est difficile de se référer à l'API Docs. Donc, je trouve certains, et ils sont là:

Here est docs en MongoDB.

et Here est un peu plus.