2016-07-18 1 views
0

J'ai cette requête dans Moteur:MongoDB global comparer avec le document précédent

history = yield self.db.stat.aggregate([ 
     {'$match': {'user_id': user.get('uid')}}, 
     {'$sort': {'date_time': -1}}, 
     {'$project': {'user_id': 1, 'cat_id': 1, 'doc_id': 1, 'date_time': 1}}, 
     {'$group': { 
      '_id': '$user_id', 
      'info': {'$push': {'doc': '$doc_id', 'date': '$date_time', 'cat': '$cat_id'}}, 
      'total': {'$sum': 1} 
     }}, 
     {'$unwind': '$info'}, 
    ]) 

Documents à stat collection ressembler à ceci:

{ 
    "_id" : ObjectId("5788fa45bc54f428d8e77903"), 
    "vrr_id" : 2, 
    "date_time" : ISODate("2016-07-15T14:59:17.411Z"), 
    "ip" : "10.79.0.230", 
    "cat_id" : "rsl01", 
    "vrr_group" : ObjectId("55f6d1b5aaab934a00bae1a4"), 
    "col" : [ 
     "dledu" 
    ], 
    "vrr_type" : "TH", 
    "doc_type" : "local", 
    "user_id" : "696230", 
    "page" : null, 
    "method" : "OpenView", 
    "branch" : 9, 
    "sc" : 200, 
    "doc_id" : "004894802", 
    "spec" : 0 
} 

/* 40 */ 
{ 
    "_id" : ObjectId("5788fa45bc54f428d8e77904"), 
    "vrr_id" : 2, 
    "date_time" : ISODate("2016-07-15T14:59:17.500Z"), 
    "ip" : "10.79.0.230", 
    "cat_id" : "rsl01", 
    "vrr_group" : ObjectId("55f6d1b5aaab934a00bae1a4"), 
    "col" : [ 
     "autoref" 
    ], 
    "vrr_type" : "TH", 
    "doc_type" : "open", 
    "user_id" : "696230", 
    "page" : null, 
    "method" : "OpenView", 
    "branch" : 9, 
    "sc" : 200, 
    "doc_id" : "000000002", 
    "spec" : "07" 
} 

Je veux comparer le terrain date_time avec date_time du document précédent et si elles ne sont pas égales (ou pas en timedelta dans les 5 secondes), incluez-le dans le résultat.

Filtrer ceci en Python était facile, est-ce possible dans Mongo? Comment puis-je atteindre cet objectif?

Répondre

0

Si vous incluez des exemples de documents de la collection «stat», je peux donner une réponse plus fiable. Mais avec les informations que vous avez fournies, je peux deviner. Ajouter un quelque chose comme la scène:

{'$group': {'_id': '$info.date', 'info': {'$first': '$info'}}} 

Cela vous donne chaque document dans la liste des résultats qui a du document précédent « date » distincte.

Cela dit, si tout ce que vous avez besoin est une liste distincte de dates, cela est plus simple et plus rapide:

db.stats.distinct("date_time") 
+0

mis à jour ma question et remarqué, qu'en fait mon 'date_time' est pas toujours égale, en raison de microsecondes. Y at-il un moyen d'obtenir une valeur, c'est-à-dire dans timedelta dans les 5 secondes? – asyndrige