2014-04-16 10 views
14

si tenta di eseguire un comando di aggregazione:"Un oggetto specifica fase gasdotto deve contenere esattamente un campo" quando si utilizza OrderedDict

request = collections.OrderedDict([ 
     ("$unwind", "$tags"), 
     ("$group", { "_id" : "$tags" , "count" : { "$sum" : 1 } }), 
     ("$project", { "_id" : 0, "tag" : "$_id" , "count" : 1 }), 
     ("$sort", { "count" : -1 }), 
     ("$limit", 3)]) 

print client.devoxx.talks.aggregate(request) 

Ma MongoDB la rifiuta:

pymongo.errors.OperationFailure: command SON([('aggregate', u'talks'), ('pipeline', [OrderedDict([('$unwind', '$tags'), ('$group', {'count': {'$sum': 1}, '_id': '$tags'}), ('$project', {'count': 1, '_id': 0, 'tag': '$_id'}), ('$sort', {'count': -1}), ('$limit', 3)])])]) failed: exception: A pipeline stage specification object must contain exactly one field. 

Mi sembra che Ho ogni fase aggregata in un articolo del dettato ordinato.

+2

Se si potesse riprodurre questo senza usare pymongo, sarebbe più chiaro e si potrebbe rimuovere il tag python possibilmente irrilevante. –

+2

@ErikAllik Inoltre, dichiaro che il tag non è valido e rimosso. E la dichiarazione non è necessaria perché un Dict non ordinato non è un argomento valido per il metodo che viene chiamato. –

risposta

12

Questo è probaby molto pymongo specifico, ma è anche molto inutile perché la forma standard di argomenti per una condotta di aggregazione è in realtà un array e può così essere semplicemente specificato in questo modo, per esempio:

request = [{ "$unwind": "$tags"}, { "$group": { "_id": "$tags" } }] 

Che è sempre in grado di serializzare in ordine e come tale non presenta alcun problema.

Quindi non è necessario utilizzare un OrderedDict.

Si sta forse confondendo il comportamento con le modifiche recenti alla shell mongo (dalla 2.6) che consente di specificare gli argomenti senza eseguire il wrapping in una matrice. Ma JSON come con alcune altre lingue si aspetta che le loro definizioni "dizionario/hash" mantengano il loro ordine specificato.

Quindi utilizzare una sintassi di matrice/elenco è ancora l'implementazione preferita.

Problemi correlati