Bạn có thể sử dụng khung tổng hợp để đạt được điều này, nó sẽ không thay đổi cách bạn đã xây dựng bộ lọc của mình vì bạn chỉ có thể sử dụng khung này trong $match
sân khấu.
Hiện không có cách an toàn về loại nào để tạo giai đoạn mẫu (đây là trên Jira backlog CSHARP- 2659 ), tuy nhiên, bạn chỉ có thể sử dụng cú pháp JSON bình thường.
var client = new MongoClient();
var db = client.GetDatabase("test");
var collection = db.GetCollection<Person>("people");
// Setup some data
var people = Enumerable.Range(1, 100)
.Select(x => new Person {Name = $"Person {x}", Age = x});
await collection.InsertManyAsync(people);
var filter = Builders<Person>.Filter.Gt(x => x.Age, 18);
var sampleSize = 10;
// Run aggregation query with a sample stage ($sample)
var personSample = await collection.Aggregate()
.Match(filter)
.AppendStage<Person>([email protected]"{{ $sample: {{ size: {sampleSize} }} }}")
.ToListAsync();
// Output sample
foreach (var person in personSample)
{
Console.WriteLine($"{person.Name}, Age: {person.Age}");
}
// Example output, note only 10 items all with the matching filter.
// Person 84, Age: 84
// Person 97, Age: 97
// Person 35, Age: 35
// Person 40, Age: 40
// Person 69, Age: 69
// Person 28, Age: 28
// Person 79, Age: 79
// Person 31, Age: 31
// Person 20, Age: 20
// Person 64, Age: 64
Bạn có thể tìm thêm thông tin về giai đoạn $ sample trên tài liệu MongoDB, https://docs.mongodb.com/manual/reference/operator/aggregation/sample/