如何解决MongoDB:如何在没有Linq的情况下返回随机元素? MongoDB,C#
我对数据库有这样的请求:
db.collection.Find(filters).Limit(limit);
创建的过滤器:filters
-类型为FilterDefinition
我如何发出请求,以使用这些过滤器-filters
来返回随机选择的元素?
我知道可以使用Linq-AsQueryable().Sample()
-但我不知道如何使用filters
类型的FilterDefinition
如果没有Linq,还有其他方法吗?
解决方法
您可以通过聚合来实现。
https://docs.mongodb.com/manual/reference/operator/aggregation/sample/
,您可以使用聚合框架来实现此目的,它不会改变构建过滤器的方式,因为您可以在$match
阶段内使用它。
目前尚无类型安全的方式来创建示例阶段(这在Jira待办事项CSHARP-2659上),但是,您只能使用常规的JSON语法。
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>($@"{{ $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
您可以在MongoDB文档https://docs.mongodb.com/manual/reference/operator/aggregation/sample/
中找到有关$ sample阶段的更多信息。 ,找到了通过Inject
的方法,也可以这样做:
db.collection.AsQueryable().Where(x => filters.Inject()).Sample(limit);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。