【问题标题】:SetFields in Mongo C# driverMongo C# 驱动程序中的 SetFields
【发布时间】:2014-05-14 10:38:21
【问题描述】:

我正在使用 C# mongo 驱动程序,并且我有如下用户集合,

 public class User
{
    public string Name { get; set; }

    public DateField Date { get; set; }

    /*
     * Some more properties
     */

    public List<string> Slugs { get; set; } //I just need to return this property

}

我正在编写一个查询,它只返回 slugs 属性。 为此,我尝试使用 mongo 驱动程序中的 SetFields(...) 方法。 SetFields 返回 User 类型的光标,我希望某些东西是我的 Slugs 属性类型,这样当我只需要一个属性时我就不会返回整组属性。 有可能吗?

【问题讨论】:

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


    【解决方案1】:

    是和不是。您可以使用聚合框架的projection operator $project 来更改数据的结构,但我不会这样做有两个原因:

    1. MongoDB 通常会尝试保留结构,除非您强制这样做,尤其是因为它更容易使用静态类型语言(旧的对象/关系不匹配:SQL 查询不回答' 在用户或博客文章中,但是从各种表中收集的一些疯狂的 Chimaera 属性,这可能需要额外的 DTO,具体取决于查询本身,这有点难看)。
    2. 聚合框架查询有点复杂,速度也有点慢,我不会让做一些微优化的冲动决定了很多不必要的复杂性。

    毕竟,省略一些字段已经是一种微优化(将索引覆盖的查询放在一边),但在客户端,空字段的成本应该几乎为零。

    【讨论】:

    • 在这里,我没有改变数据的结构,只是想要它的一个子集,但我看到 C# mongo 驱动程序中的 SetFields 返回类类型的 cusor。这将增加其性能
    • 不确定你在说什么。 SetFields 不会更改返回类型,并且未填充的字段并不是特别昂贵。
    • 我在我的问题中提到了我对设置字段的期望
    • 好吧,就像我写的那样,SetFields 不会改变类型,你的期望是错误的。您可以使用 LINQ-to-Objects 的 Select(p =&gt; p.Slugs),它将返回 IEnumerable&lt;List&lt;string&gt;&gt;,但请注意,IEnumerable 上的操作可能比 MongoCursor 上的操作慢得多(例如,Count():@987654330 @ 扩展方法将反序列化整个结果集,而 MongoCursor 将简单地向数据库询问计数。
    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多