2014-07-22 5 views
0

j'ai un DB mongo qui ressemble à ceci ->requête d'agrégation MongoDB dans un tableau sur plusieurs entrées

Nom de collection: les utilisateurs

{ username:'something' 
    _id : ObjectId(someID1) 
    acl : { users : [ObjectId(someID1),ObjectId(someID2),ObjectId(someID3)] , group : [grpID4,grpID5,grpID6] } 
    . 
    . 
    . 
} 

Je veux avoir une requête d'agrégation qui regarde dans tous les documents pour db.users.acl.users et trouve un compte de chaque objectID unique.

Il est comme l'ajout de tous les tableaux de users.acl.users puis retourner le compte de chaque ID unique dans un dictionnaire python

{ 
"result" : [ 
     { 
       "_id" : ObjectId("someID1"), 
       "count" : 20     

     }, 
     { 
       "_id" : ObjectId("someID2"), 
       "count" : 2 
     }, 
     { 
       "_id" : ObjectID("someID3") 
       "count" : 1 
     }, 

], 
"ok" : 1 
} 

J'ai essayé la voie pythonique, ce premier ajout de tous les tableaux et puis trouver le compte, mais je veux le faire plus par requête par rapport à plus par python. Je ne sais vraiment pas comment interroger un tableau comme celui-ci.

une idée par où commencer?

Répondre

3

Habituellement, lorsque vous travaillez avec des tableaux dans MongoDB dans le cadre d'agrégation, vous voulez utiliser l'opérateur de pipeline $unwind pour "dénormaliser" le contenu en tant que documents séparés. Le vous permet de travailler avec eux dans d'autres étages de pipeline:

db.users.aggregate([ 
    { "$unwind": "$acl.users" }, 
    { "$group": { 
     "_id": "$acl.users", 
     "count": { "$sum": 1 } 
    }} 
]) 

syntaxe Python est généralement essentiellement identique à la syntaxe shell de JavaScript, des exemples directs tels que SQL to Aggregation mapping devrait généralement appliquer.

Questions connexes