MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Abrufen des nach Relevanz geordneten Ergebnisses aus der Textabfrage in der MongoDB-Sammlung mithilfe des C#-Treibers

Ich konnte das durch Versuch und Irrtum zum Laufen bringen. Der Trick besteht darin, dass Ihr Datenobjekt bereits ein Feld enthalten muss, das den MetaTextScore enthält Wert. Also angesichts der Schnittstelle:

interface ITextSearchSortable {
    double? TextMatchScore { get; set; }
}

die endgültige Funktion sieht so aus:

public IEnumerable<T> TextSearch<T>(MongoCollection<T> coll, string text) where T:ITextSearchSortable {
    var cursor = coll.Find(Query.Text(text))
        .SetFields(Fields<T>.MetaTextScore(t => t.TextMatchScore))
        .SetSortOrder(SortBy<T>MetaTextScore(t => t.TextMatchScore));
    foreach(var t in cursor) {
        // prevent saving the value back into the database
        t.TextMatchScore = null;
        yield return t;
    }
}

Es ist erwähnenswert, dass TextMatchScore darf kein [BsonIgnore] haben Dekoration, oder es wird eine Ausnahme geben. Es kann jedoch einen [BsonIgnoreIfNull] haben Dekoration. Indem also der Wert aus dem Datenobjekt entfernt wird, bevor es zurückgegeben wird, kann das Datenobjekt wieder in der Sammlung gespeichert werden, ohne einen Müllwert einzufügen.