c# - 如何使用 C# 在 MongoDb 的 Find(filter, options) 中设置投影?
问题描述
我收到以下语法的编译错误。
var index = ...;
var projection = Builders<Thing>.Projection
.Include(a => a.Name)
.Include(a => a.Stuff[index]);
var options = new FindOptions<Thing, Thing> { Projection = projection };
var filter = Builders<Thing>.Filter.Where(a => a.Name == name);
var output = await _dbContext.Things.Find(filter, options)
.SingleOrDefaultAsync(token);
return output;
计算机对我的选项不满意,要求它们是非通用的。但是,如果我使用FindOptions
而不是FindOptions<A,B>
,则没有Projection
要设置的属性。因为我确实需要我的投影,所以我一定会使用通用版本。
我还注意到我可以使用FindAsync(...)
, 而不是Find(...)
, 这似乎接受了通用版本。遗憾的是,这不是一个选项,因为该方法的签名是返回Task<Thing>
,我得到Task<IAsyncCursor<Thing>>
. 我被困在如何去游标,获取集合中的单个元素(唯一的命名保证)返回正确类型的任务。(如果我去ToList()
,异步被杀死。)
那里没有很多例子。
我有一个工作的 mongo 脚本,但它正在将它翻译成 C#,这是一个很大的障碍。
db.getCollection('things').find(
{ name: "blobbo" },
{ "stuff.shazoo": 1, name: 1 }
)
解决方案
假设您的模型如下所示:
public class Thing
{
public string Name { get; set; }
public Stuff[] Stuff { get; set; }
}
public class Stuff
{
public string Shazoo { get; set; }
public string Foofoo { get; set; }
}
您可以通过聚合获得所需的结果,如下所示:
var projection = Builders<Thing>.Projection.Expression(
t => new Thing
{
ID = t.ID,
Name = t.Name,
Stuff = t.Stuff.Select(s => new Stuff { Shazoo = s.Shazoo }).ToArray()
});
var things = await collection
.Aggregate()
.Match(filter)
.Project(projection)
.ToListAsync();
推荐阅读
- python - python和c++对象的内存地址不相同
- javafx - 如何在单个 javafx 模板中的不同坐标处绘制 100 个二维形状(如圆形)?
- c# - 算子的预增量
- python - 如何修改满足条件的值下一行的值?
- python-3.x - 无法将时间序列图更改为每小时间隔
- jms - JCA JMS 和普通 JMS 有什么区别
- assembly - 为什么堆栈上参数的顺序是这样的顺序,即第一个参数位于最低地址,第二个位于第二低地址,依此类推
- javascript - 复选框选中或取消选中值 null
- python - 为什么 keras model.predict 只返回一个概率?如何输出所有类的所有概率?
- php - 这个电子邮件功能有问题吗?