c# - 使用 C# .NET 驱动程序 2.0 投影 mongodb 子文档

标签 c# .net mongodb mongodb-.net-driver

我有以下结构:

public class Category
{
    [BsonElement("name")]
    public string CategoryName { get; set; }

    [BsonDateTimeOptions]
    [BsonElement("dateCreated")]
    public DateTime DateStamp { get; set; }

    [BsonElement("tasks")]        
    public List<TaskTracker.Task> Task { get; set; }
}

public class Task
{
    [BsonElement("name")]
    public string TaskName { get; set; }

    [BsonElement("body")]
    public string TaskBody { get; set; }
}

我正在尝试查询 Category 以获取所有 TaskName 值,然后将它们返回到列表中以显示在列表框中。

我试过使用这个查询:

var getTasks = Categories.Find<Category>(x => x.CategoryName == catName)
                         .Project(Builders<Category>.Projection
                                                    .Include("tasks.name")
                                                    .Exclude("_id"))
                         .ToListAsync()
                         .Result;   

但是返回的是:{"tasks": [{"name: "test"}]}

有没有办法只返回字符串值?

最佳答案

正如 Avish 所说,您必须使用聚合 API 来使生成的文档看起来像您想要的那样。但是,如果您像对 Find 所做的那样对项目使用表达式树 API,则驱动程序可以使其中一些消失。例如,我认为以下内容应该适合您:

var taskNames = await Categores.Find(x => x.CategoryName == catName)
    .Project(x => x.Tasks.Select(y => y.Name))
    .ToListAsync();

这应该只为每个类别返回一个可枚举的字符串 (tasks.name)。驱动程序将检查此投影并仅拉回 tasks.name 字段。

关于c# - 使用 C# .NET 驱动程序 2.0 投影 mongodb 子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720783/

相关文章:

c# - 在选择要写入新应用程序的第一个 "class"时,您应该如何决定?

c# - 是否应该重写所有接口(interface)以返回 Task<Result>?

c# - 将此 foreach 产量重写为 linq 产量?

c# - 在方法之间共享 DTO 类是否会创建有关 'extra' 属性的漏洞?

.net - 每 4 分钟完整备份运行的 SQL Server 数据库的影响

c# - 使用 Sleep 模拟 Thread Yield 方法

c# - 如果第 2 代已满,垃圾收集期间会发生什么?

node.js - 如何正确解耦 MongoDB

java - Spring-data-mongo 无法使用构造函数实例化 java.util.List

node.js - 使用 Node.js 和 mongoose 更新嵌套子文档