簡體   English   中英

將復合ID序列化為二進制

[英]Serializing a composite id into binary

我有以下代表復合_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>();
}

我寫了一個使用所有8個字段的upsert語句,但速度很可怕。 所以我接下來要做的是使用p0,BinarySerialized(p1:p7)作為_id。 我的用例允許我連接這些字段而不會出現問題。

序列化p1-p7的最佳方法是什么? C#的串行器,還是BSON的?

為了記錄,upsert:

col.Update(Query.And(
    Query.EQ("_id.p0", doc.p0),
    Query.EQ("_id.p1", doc.p1),
    Query.EQ("_id.p2", doc.p2),
    Query.EQ("_id.p3", doc.p3),
    Query.EQ("_id.p4", doc.p4),
    Query.EQ("_id.p5", doc.p5),
    Query.EQ("_id.p6", doc.p6),
    Query.EQ("_id.p7", doc.p7)),
    Update.Push("data", doc.data),
    UpdateFlags.Upsert);

通過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);

如果您編寫查詢,分別檢查_id的每個組件,則服務器無法使用_id索引。

我首先要研究為什么你的upsert如此緩慢。 它可能只是查詢部分的編寫方式,在這種情況下,更改Id可能沒有幫助。

如果你想將p1到p7組件編碼為二進制字節,我建議你定義你的Id類,如下所示:

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

但是你必須在某處編寫一些輔助方法或屬性來處理打包和解包字節。 我不會使用任何類型的串行器,但只是一次打包4個字節(所以p1to7將是28個字節長)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM