2013-01-21 4 views
5

Wie finde ich das Dokument mit dem maximalen Feld uid mit map-reduce in pymongo?Wie bekomme ich das Dokument mit maximalem Wert für ein Feld mit map-reduce in pymongo?

Ich habe versucht, die folgenden, aber es druckt Leerzeichen:

from pymongo import Connection 
from bson.code import Code 

db = Connection().map_reduce_example 
db.things.insert({ 
    "_id" : "50f5fe8916174763f6217994", 
    "deu" : "Wie Sie sicher aus der Presse und dem Fernsehen wissen, gab es in Sri Lanka mehrere Bombenexplosionen mit zahlreichen Toten.\n", 
    "uid" : 13, 
    "eng" : "You will be aware from the press and television that there have been a number of bomb explosions and killings in Sri Lanka." 
}) 

db.things.insert({ 
    "_id" : "50f5fe8916234y0w3fvhv234", 
    "deu" : "Ich bin schwanger foo bar.\n", 
    "uid" : 14, 
    "eng" : "I am pregnant foobar." 
}) 

db.things.insert({ 
    "_id" : "50f5fe8916234y0w3fvhv234", 
    "deu" : "barbar schwarz sheep, haben sie any foo\n", 
    "uid" : 14, 
    "eng" : "barbar black sheep, have you any foo" 
}) 

m = Code("function() {emit(this.uid,{'uid':this.uid,'eng':this.eng})}") 

r = Code("function (key, values) {var total = 0;for (var i = 0; i < values.length; i++) {total += values[i];}return total;}") 


result = db.things.inline_map_reduce(m, r) 

for r in result: 
    print 

Ein Beispiel Dokument, wie diese aussehen:

{ 
    "_id" : ObjectId("50f5fe8916174763f6217994"), 
    "deu" : "Wie Sie sicher aus der Presse und dem Fernsehen wissen, gab es mehrere Bombenexplosionen mit zahlreichen Toten.\n", 
    "uid" : 13, 
    "eng" : "You will be aware from the press and television that there have been a 
      number of bomb explosions and killings." 
} 
+1

btw, 'barbar schwarze Schafe, haben Sie eine foo' würde' barbar schwarzes Schaf, hast du etwas foo' in deutscher Sprache. – luckydonald

Antwort

31

Sie find_one verwenden können, das Dokument mit der maximalen uid zu finden, indem Sortieren auf diesem Feld absteigend:

db.things.find_one(sort=[("uid", -1)]) 

oder mit die definierte Konstante:

db.things.find_one(sort=[("uid", pymongo.DESCENDING)]) 
+0

ist es nicht teurer, 'find()' oder 'find_one()' ohne die reduzierte Karte zu tun, besonders wenn ich fast 2.000.000 Dokumente in der Datenbank habe. – alvas

+1

Nein, aber Sie möchten dennoch sicherstellen, dass Sie einen Index für "uid" haben, wenn Sie dies benötigen, um performant zu sein. – JohnnyHK

+2

Sie können mehr beschreibende vordefinierte Konstanten als Argument für die Richtung verwenden: 'pymongo.DESCENDING' anstelle von' -1' und 'pymongo.ASCENDING' anstelle von' 1' – userlond

Verwandte Themen