試行錯誤しながらこれを機能させることができました。秘訣は、データオブジェクトに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]
を含めることができます 装飾。したがって、値を取得する前にデータオブジェクトから値をスクラブすることで、ガベージ値を入力せずにデータオブジェクトをコレクションに保存し直すことができます。