2016-05-24 3 views
0

J'ai cette requête globale:

$paroles_query = array(
      array(
       '$match' => array(
        'metadata.content_type' => 'parole', 
        'metadata.yearmonthday' => array(
         '$gte' => $ymd_begin,//20160516 
         '$lt' => $ymd_end //20160522 
        ), 
       ), 
      ), 

     array(
      '$project' => array(
       'yearmonthday' => '$metadata.yearmonthday', 
       'content_id' => '$metadata.content_id', 
       'total' => array(
        '$add' => $add, 
       ), 
      ), 
     ), 

     array(
      '$sort' => array(
       'total' => -1, 
      ), 
     ), 
     array(
      '$group' => array(
       '_id' => '$content_id', 
       'total' => array('$sum' => '$total') 
      ), 
     ), 
     array(
      '$limit' => 10, 
     ) 
    ); 

Tout fonctionne bien et j'obtenir mon résultat, mais le stade limite de $ ne fonctionne pas si je suis 150 000 documents au lieu de 10.

J'ai essayé la syntaxe ['$limt' => 10] mais aucune de ces solutions ne fonctionne pour moi. peut enyone aider? big thx à l'avance

MISE À JOUR: '$ sort' ne fonctionne pas non plus.

MISE À JOUR: Voici un de mes documents:

{ 
"_id" : ObjectId("5740a27af32d054114687c65"), 
"metadata" : { 
    "app" : "web", 
    "content_id" : "106366780", 
    "content_type" : "traduction", 
    "yearmonthday" : 20160521, 
    "device_id" : "9615b7451e0031e15fcbc5c064418a8abb2740dd", 
    "notification_channel" : "web", 
    "year" : 2016, 
    "month" : 5, 
    "day" : 21, 
    "hour" : 23, 
    "minute" : 24, 
    "weekday" : 6, 
    "yearmonth" : 201605 
}, 
"hourly" : { 
    "18" : 1, 
    "23" : 1 
}, 
"minute" : { 
    "18" : { 
     "1" : 1 
    }, 
    "23" : { 
     "24" : 1 
    } 
}, 
"new" : { 
    "hourly" : { 
     "18" : 1, 
     "23" : 1 
    }, 
    "minute" : { 
     "18" : { 
      "1" : 1 
     }, 
     "23" : { 
      "24" : 1 
     } 
    } 
} 

}

Et voici la requête MongoDB (est fonctionne parfaitement bien):

db.getCollection('visitors_daily').aggregate({$match : {"metadata.content_type" : "parole", "metadata.yearmonthday" : { $gte : 20160516, $lt: 20160523}}},{$project : { total :{$add : [{$ifNull : ["$hourly.0",0]},{$ifNull : ["$hourly.1",0]},{$ifNull : ["$hourly.2",0]},{$ifNull : ["$hourly.3",0]},{$ifNull : ["$hourly.4",0]},{$ifNull : ["$hourly.5",0]},{$ifNull : ["$hourly.6",0]},{$ifNull : ["$hourly.7",0]},{$ifNull : ["$hourly.8",0]},{$ifNull : ["$hourly.9",0]},{$ifNull : ["$hourly.10",0]},{$ifNull : ["$hourly.11",0]},{$ifNull : ["$hourly.12",0]},{$ifNull : ["$hourly.13",0]},{$ifNull : ["$hourly.14",0]},{$ifNull : ["$hourly.15",0]},{$ifNull : ["$hourly.16",0]},{$ifNull : ["$hourly.17",0]},{$ifNull : ["$hourly.18",0]},{$ifNull : ["$hourly.19",0]},{$ifNull : ["$hourly.20",0]},{$ifNull : ["$hourly.21",0]},{$ifNull : ["$hourly.22",0]},{$ifNull : ["$hourly.23",0]}]},ymd : "$metadata.yearmonthday" , content_id :"$metadata.content_id"}},{$group : {_id : "$content_id","total" : {$sum : "$total"}}}, {$sort : {"total" : -1}}) 

Cette requête est pour la récupération nombre de visites par type de page (type_type) dans une plage de dates (basé sur metadata.yearmonthday), ceci est mon 5 premier résultat dans mongo db:

{ 
    "_id" : "104846552", 
    "total" : 227 
} 

/* 2 */ 
{ 
    "_id" : "100611974", 
    "total" : 151 
} 

/* 3 */ 
{ 
    "_id" : "107373971", 
    "total" : 127 
} 

/* 4 */ 
{ 
    "_id" : "1766982", 
    "total" : 124 
} 

/* 5 */ 
{ 
    "_id" : "100842840", 
    "total" : 115 
} 
+0

Il semble qu'il y ait trop de virgules dans vos tableaux. – JST

+0

@JST Avec ou sans virgules, le résultat semble être le même! –

+0

Quelle est la raison derrière la mise en place d'un tableau de bord '$ limit'' array ( '$ limit' => 5, ) 'juste après l'étape' $ project'? et puis faire une autre «limite de $» à la fin? – chridam

Répondre

0

DAMMMMNN, aucune erreur dans la requête, il était nginx .... gars THX