C# 将复合id序列化为二进制

C# 将复合id序列化为二进制,c#,mongodb,serialization,mongodb-.net-driver,C#,Mongodb,Serialization,Mongodb .net Driver,我有以下表示复合id的测试类: private sealed class Id { public int p0 { get; set; } public int p1 { get; set; } public int p2 { get; set; } public int p3 { get; set; } public int p4 { get; set; } public int p5 { get; set; } public int p

我有以下表示复合id的测试类:

private sealed class Id
{
    public int p0 { get; set; }
    public int p1 { get; set; }
    public int p2 { get; set; }
    public int p3 { get; set; }
    public int p4 { get; set; }
    public int p5 { get; set; }
    public int p6 { get; set; }
    public int p7 { get; set; }
}
数据类:

private sealed class MdbData
{
    [BsonId]
    public Id _Id;
    public List<string> data = new List<string>();
}

我会先调查一下为什么你的上升速度这么慢。这可能只是查询部分的编写方式,在这种情况下,更改Id可能没有帮助

如果您确实希望将p1到p7组件编码为二进制字节,我建议您如下定义Id类:

public sealed class Id
{
    public int p0 { get; set; }
    public byte[] p1to7 { get; set; }
}

但是,您必须在某处编写一些助手方法或属性来处理字节的打包和解包。我不会使用任何类型的序列化程序,只需一次打包4个字节的ints(因此p1to7将是28个字节长)。

看到您的问题已被编辑,您应该重写查询,以便服务器可以利用_id索引。最简单的方法是使用类型化查询生成器:

var query = Query<MdbData>.EQ(x => x._Id, doc._Id);
var update = Update<MdbData>.Push(x => x.data, doc.data);
collection.Update(query, update, UpdateFlags.Upsert);
var query=query.EQ(x=>x.\u Id,doc.\u Id);
var update=update.Push(x=>x.data,doc.data);
Update(查询、更新、UpdateFlags.Upsert);

如果您编写的查询分别检查了_id的每个组件,服务器将无法使用_id索引。

如果我正确理解您的用例,您是否可以对二进制数据进行base64编码,然后将生成的字符串用作MongoDB中的id?Base64很容易在C#中编码/解码。我在MDB文档中读到不应该使用Base64。1) 它增加了空间。2) 它使搜索复杂化,因为它们也必须被编码。有一种方法可以用二进制实现。好的,所以建议使用BitCoverter类,它生成byte[]。关于速度,我尝试将值放入_id和它之外,得到了基本相同的结果。如果我删除列表和upsert,它会非常快。查看您编辑的问题,您编写查询的方式将无法使用_id索引(因为您正在分别测试复合索引的每个部分)。
var query = Query<MdbData>.EQ(x => x._Id, doc._Id);
var update = Update<MdbData>.Push(x => x.data, doc.data);
collection.Update(query, update, UpdateFlags.Upsert);