2017-07-25 2 views
0

Ich habe die folgende Abfrage in go lang, der gut arbeitet:

query["name"] = bson.M{"$regex": searchStr, "$options": "i"} 
query["likes"] = userSession.Id 
c.Find(query).Skip(0).Limit(2).Select(bson.M{"name":1, "profile":1, "description":1, "user_id":1, "likes":1}).Sort("-pro", "-check").All(&business); 

Dann habe ich versucht, die gleiche Abfrage mit der Aggregation Rahmen zu schreiben:

query["name"] = bson.M{"$regex": searchStr, "$options": "i"} 
query["likes"] = userSession.Id 
oe := bson.M{ 
    "$match" :query, 
} 
oa := bson.M{ 
    "$project": bson.M {"pro": 1, "check": 1, "name":1, "profile":1, "description":1, "user_id":1, "likes":1, "nrLikes": bson.M{ "$size": "$likes" }, "city": 1, "country": 1, "industry": 1}, 
} 
ol := bson.M{ 
    "$limit" :pageSize, 
} 
os := bson.M{ 
    "$skip" :skips, 
} 
or := bson.M{ 
    "$sort" : bson.M {"pro": -1, "check": -1}, 
} 

pipe := c.Pipe([]bson.M{oe, oa, or, os, ol }) 

pipe.All(&business) 

Die zweite Abfrage funktioniert in 90% der Fälle, aber in 10% der Fälle gibt es eine andere Reihenfolge der Ergebnisse.

Irgendwelche Gedanken?

Später bearbeiten: Hier sind die resuls

[]bson.M{ 
{ 
    "description": "<p>sasdfdasf</p>", 
    "profile":  []interface {}{ 
     "rKwMmXPWheGczwvGn2TzSRU7jRorhorKwMmXPWheGczwvGn2TzSRU7jRorho=0.jpg", 
    }, 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "nrLikes": int(1), 
    "name":  "ediloc.com2", 
    "city":  "Calimanesti", 
    "industry": "Automotive", 
    "_id":  "Yo\xd4f\x1a\xa9Q|w\tG^", 
    "user_id": "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "country": "Romania", 
}, 
{ 
    "_id":   "Yo\xc7\xd7\x1a\xa9Qy1['\xea", 
    "user_id":  "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "name":  "ediloc.com", 
    "country":  "Romania", 
    "description": "<p>a</p>", 
    "profile":  []interface {}{ 
     "1ssSySNRZwGJJwqzXghL6qzAVfWZis1ssSySNRZwGJJwqzXghL6qzAVfWZis=1.jpg", 
    }, 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "nrLikes": int(1), 
    "city":  "Calimanesti", 
    "industry": "Accounting", 
}, 
} 


[]bson.M{ 
{ 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "_id":  "Yo\xd4f\x1a\xa9Q|w\tG^", 
    "name": "ediloc.com2", 
    "city": "Calimanesti", 
    "country": "Romania", 
    "profile": []interface {}{ 
     "rKwMmXPWheGczwvGn2TzSRU7jRorhorKwMmXPWheGczwvGn2TzSRU7jRorho=0.jpg", 
    }, 
    "user_id":  "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "industry": "Automotive",, 
    "nrLikes":  int(1), 
}, 
{ 
    "_id":  "Yo\xc7\xd7\x1a\xa9Qy1['\xea", 
    "user_id": "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "industry": "Accounting", 
    "profile": []interface {}{ 
     "1ssSySNRZwGJJwqzXghL6qzAVfWZis1ssSySNRZwGJJwqzXghL6qzAVfWZis=1.jpg", 
    }, 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "nrLikes":  int(1), 
    "name":  "ediloc.com", 
    "city":  "Calimanesti", 
    "country":  "Romania", 
    "description": "<p>a</p>", 
}, 
} 


[]bson.M{ 
{ 
    "nrLikes":  int(1), 
    "user_id":  "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "description": "<p>a</p>", 
    "profile":  []interface {}{ 
     "1ssSySNRZwGJJwqzXghL6qzAVfWZis1ssSySNRZwGJJwqzXghL6qzAVfWZis=1.jpg", 
    }, 
    "country": "Romania", 
    "industry": "Accounting", 
    "likes": []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "_id": "Yo\xc7\xd7\x1a\xa9Qy1['\xea", 
    "name": "ediloc.com", 
    "city": "Calimanesti", 
}, 
{ 
    "name":  "ediloc.com2", 
    "industry": "Automotive", 
    "description": "<p>sasdfdasf</p>", 
    "likes":  []interface {}{ 
     "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    }, 
    "user_id": "Yo\xc7;\x1a\xa9Qy\b\xb8\xa2\xf9", 
    "city": "Calimanesti", 
    "country": "Romania", 
    "profile": []interface {}{ 
     "rKwMmXPWheGczwvGn2TzSRU7jRorhorKwMmXPWheGczwvGn2TzSRU7jRorho=0.jpg", 
    }, 
    "nrLikes": int(1), 
    "_id":  "Yo\xd4f\x1a\xa9Q|w\tG^", 
}, 
} 

Pro und Prüffelder sind IN32, die Dokumente mit einem höheren Pro-Feldnummer haben Vorrang vor den Dokumenten haben, die höher Prüffelder haben.

+1

Was ist der Datentyp Ihrer 'Pro' Feld? Können Sie eine Beispielausgabe einfügen, bei der die Sortierung falsch ist? Wenn die Ergebnisse nicht vorhersehbar sind, haben Sie wahrscheinlich gemischte Datentypen, die nach [BSON Comparison/Sort Order] sortieren (https://docs.mongodb.com/manual/reference/bson-type-comparison-order/#bson) -Typen-Vergleichsreihenfolge). – Stennie

+0

@Stennie Ich habe meine Frage bearbeitet und die Ausgabe hinzugefügt. Auch die Felder check und pro sind beide int32. Und halten Sie auch in finden Sie, dass die erste Abfrage mit cursor.sort() funktioniert gut. –

+0

Haben Sie die Ausgabe geändert? Wenn ich etwas nicht verpasse, scheinen die aktuellen Ergebnisdokumente nicht die Felder "pro" und "check" zu haben, nach denen Sie sortieren. – Stennie

Antwort

0

Stellen Sie sicher, dass Sie Ihre Sortierpipelinestufe haben, bevor Ihr Limit & überspringen Stufen. Nur bei sortierter Eingabe mit Limit/Überspringen können Sie die gleichen Ergebnisse zuverlässig erhalten.

EDIT

Realisiert, dass Sie bson.M {"pro": -1, "check": -1} verwenden, um Ihre Sortierreihenfolge zu definieren. Die Iterationsreihenfolge einer Karte ist in Go nicht angegeben und kann geändert werden. Dies ist wahrscheinlich der Grund, warum Sie inkonsistente Ergebnisse erhalten.

Versuchen Sie, dies in bson.D zu ändern, damit die Reihenfolge der zu sortierenden Spalten beibehalten wird.

Es hilft Ihnen zu sehen, wie die Abfrage Sort Methode dies aus den Strings erstellt, die Sie bereitstellen.

Für Ihren Anwendungsfall würden Sie die or Variable ändern:

or := bson.M{ 
    "$sort": bson.D{ 
     bson.DocElem{Name: "pro", Value: -1}, 
     bson.DocElem{Name: "check", Value: -1}, 
    }, 
} 
+0

Ja, ich mache die Sortierung vor dem Überspringen und begrenzen. –

+0

Entschuldigung, Sie sind in der Tat. Ich habe gerade die Deklarationsreihenfolge gelesen, nicht die Reihenfolge, in der sie an 'c.Pipe' übergeben wurden. Nebenbei gesagt, die Empfehlung ist Limit vor Überspringen (siehe [diese vorherige Frage] (https://stackoverflow.com/questions/24160037/skip-and-limit-in-aggregation-framework)). Denke nicht, dass das dein Problem sein wird. –

+0

Ich habe es jetzt versucht, aber es hat nichts geändert. Ein Dokument hat pro: 1 und überprüfen: 0 und das andere hat pro: 0 und überprüfen: 1 können Sie hier sehen: 2message.com: 8080/search/business? q = e Wenn Sie die Seite mehrmals aktualisieren –

Verwandte Themen