मैं इसे परीक्षण और त्रुटि के माध्यम से काम करने में सक्षम था। चाल यह है कि आपके डेटा ऑब्जेक्ट पर पहले से ही एक फ़ील्ड होना आवश्यक है जो MetaTextScore
को धारण करेगा मूल्य। तो दिया गया इंटरफ़ेस:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
अंतिम कार्य इस तरह दिखता है:
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;
}
}
यह ध्यान देने योग्य है कि TextMatchScore
[BsonIgnore]
नहीं हो सकता सजावट, या एक अपवाद होगा। हालांकि, इसमें [BsonIgnoreIfNull]
. हो सकता है सजावट। इसलिए डेटा ऑब्जेक्ट को प्राप्त करने से पहले उसके मूल्य को स्क्रब करके, डेटा ऑब्जेक्ट को गारबेज वैल्यू डाले बिना संग्रह में वापस सहेजा जा सकता है।