[英]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.