MongoDB C#官方驱动程序:将对象映射到短名称以限制空间
我正在寻找一种方法,将使用可读名称(“类别”)定义的Bson对象映射到短名称(“ct”),并限制主文档库中项目名称占用的空间。我见过使用其他驱动程序的情况,但是使用官方驱动程序又如何呢。我能做什么,哪里是最好的定义地方。可以在查询中使用长名称并检索短内容吗 谢谢。考虑一下记录 {姓:“史密斯”,最好成绩:3.9} 字符串“last_name”和“best_score”将存储在每个对象的BSON中。使用较短的字符串可以节省空间: {名字:“史密斯”,分数:3.9} 每个文档将节省9个字节。当然,这会降低程序员的表达能力,除非您有一个非常关注的集合,否则不建议这样做 字段名不存储在索引中,因为索引具有预定义的结构。因此,缩短字段名无助于索引的大小。通常不需要使用短字段名 有关更多详细信息,请参阅源代码 但另一面是在著名的主题“”中描述的MongoDB C#官方驱动程序:将对象映射到短名称以限制空间,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我正在寻找一种方法,将使用可读名称(“类别”)定义的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)。