Tôi đã có thể làm cho điều này hoạt động thông qua thử nghiệm và sai sót. Mẹo là đối tượng dữ liệu của bạn cần phải có một trường trên đó sẽ chứa MetaTextScore
giá trị. Vì vậy, với giao diện:
interface ITextSearchSortable {
double? TextMatchScore { get; set; }
}
hàm cuối cùng trông như thế này:
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;
}
}
Cần lưu ý rằng TextMatchScore
không thể có [BsonIgnore]
trang trí, hoặc sẽ có một ngoại lệ. Tuy nhiên, nó có thể có [BsonIgnoreIfNull]
trang trí. Vì vậy, bằng cách loại bỏ giá trị khỏi đối tượng dữ liệu trước khi tạo ra nó, đối tượng dữ liệu có thể được lưu lại vào bộ sưu tập mà không cần đưa vào giá trị rác.