【问题标题】:How to set projection in Find(filter, options) in MongoDb using C#?如何使用 C# 在 MongoDb 的 Find(filter, options) 中设置投影?
【发布时间】:2021-06-20 16:08:10
【问题描述】:

我得到以下语法的编译错误。

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&lt;A,B&gt;,则没有要设置的属性Projection。因为我确实需要我的投影,所以我一定会使用通用版本。

我还注意到我可以使用FindAsync(...),而不是Find(...),这似乎接受了通用版本。遗憾的是,这不是一个选项,因为该方法的签名是返回Task&lt;Thing&gt;,而我得到的是Task&lt;IAsyncCursor&lt;Thing&gt;&gt;。我被困在如何去游标,获取集合中的单个元素(唯一的命名保证)返回正确类型的任务。 (如果我去ToList(),异步被杀死。)

没有很多例子。

我有一个可以工作的 mongo 脚本,但它将它转换成 C# 是个大障碍。

db.getCollection('things').find(
  { name: "blobbo" },
  { "stuff.shazoo": 1, name: 1 }
)

【问题讨论】:

    标签: c# mongodb projection


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2014-12-11
      相关资源
      最近更新 更多