Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB C#官方驱动程序:将对象映射到短名称以限制空间_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

MongoDB C#官方驱动程序:将对象映射到短名称以限制空间

MongoDB C#官方驱动程序:将对象映射到短名称以限制空间,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我正在寻找一种方法,将使用可读名称(“类别”)定义的Bson对象映射到短名称(“ct”),并限制主文档库中项目名称占用的空间。我见过使用其他驱动程序的情况,但是使用官方驱动程序又如何呢。我能做什么,哪里是最好的定义地方。可以在查询中使用长名称并检索短内容吗 谢谢。考虑一下记录 {姓:“史密斯”,最好成绩:3.9} 字符串“last_name”和“best_score”将存储在每个对象的BSON中。使用较短的字符串可以节省空间: {名字:“史密斯”,分数:3.9} 每个文档将节省9个字节。当然,这

我正在寻找一种方法,将使用可读名称(“类别”)定义的Bson对象映射到短名称(“ct”),并限制主文档库中项目名称占用的空间。我见过使用其他驱动程序的情况,但是使用官方驱动程序又如何呢。我能做什么,哪里是最好的定义地方。可以在查询中使用长名称并检索短内容吗

谢谢。

考虑一下记录

{姓:“史密斯”,最好成绩:3.9}

字符串“last_name”和“best_score”将存储在每个对象的BSON中。使用较短的字符串可以节省空间:

{名字:“史密斯”,分数:3.9}

每个文档将节省9个字节。当然,这会降低程序员的表达能力,除非您有一个非常关注的集合,否则不建议这样做

字段名不存储在索引中,因为索引具有预定义的结构。因此,缩短字段名无助于索引的大小。通常不需要使用短字段名

有关更多详细信息,请参阅源代码

但另一面是在著名的主题“”中描述的


我个人认为短名字是一种不好的方式。

因为没有人真正给出这个问题的答案,这里是答案

使用官方驱动程序,您可以通过使用BSOneElement装饰属性名称来实现这一点。例如:

public class SomeClass
{
    public BsonObjectId Id { get; set; }

    [BsonElement("dt")]
    public DateTime SomeReallyLongDateTimePropertyName { get; set; }
}
现在,驱动程序将使用“dt”作为BSON属性名


但是,此时无法使用POCO属性名进行查询。您需要在查询中使用“dt”。在提供LINQ风格查询功能的C#驱动程序之上构建了一个单独的项目,但我没有测试它以验证它是否能满足您的要求。

最好保持模型干净。驱动程序允许在外部执行

BsonClassMap.RegisterClassMap<SomeClass>(x =>
{
     x.AutoMap();
     x.GetMemberMap(m => m.SomeReallyLongDateTimePropertyName).SetElementName("dt");
});
BsonClassMap.RegisterClassMap(x=>
{
x、 自动映射();
x、 GetMemberMap(m=>m.SomeReallyLongDateTimePropertyName).SetElementName(“dt”);
});

有一个sens,但我使用一个集合,其中项目名称和子项目始终使用相同的信息重复,即项目名称或键名称。70%以上是冗长的信息,而不是价值数据。我认为映射有一个真正的意义。看看你的数据存储和bandwith是不是免费的。虽然我同意你不想牺牲代码的可读性,但在某些情况下,这9个字节会很快累积起来,这是毫无价值的。这个答案很糟糕,因为虽然它对于10个对象的集合是有效的,但在处理1000万个对象的集合时,它会造成伤害。磁盘空间很便宜,但不是免费的。磁盘使用甚至不是最大的问题。较大的名称将降低对象在RAM磁盘缓存和CPU缓存中的可缓存性。这会大大降低性能,尤其是在磁盘驱动器上,即使对于较小的数据集也是如此。“嗯,是ct类别还是CustomerTab。等等,字段
a
是什么?”我认为在90%的情况下,这是过早的优化。我认为如果你有一个为数据库中的字段创建的名称记录,并存储在安全的地方,你就可以了。这很好,但所有查询都可以通过短名称进行。所以一个小时后你会忘记下面的查询是什么意思:query.And(query.EQ(“fn”,filter.Field1),query.NE(“ms”,filter))或者类似的东西。同意。。但是,如果您的集合将包含数百万条甚至数十亿条记录(例如,对于分析平台),那么您应该在某个地方保留一些关于属性名称的注释。@ilans此代码应该只调用一次,可能在singleton配置实例中x、 AutoMap()'对“SomeClass”的所有属性进行初始检查:检测数据类型、字段名等,并仅保留设置。然后可以覆盖上一步中的设置。在本例中,“SetElementName”要求mongo驱动程序使用字段名“dt”而不是默认名称(SomeReallyLongDateTimePropertyName)。