2017-05-19 60 views
0

這是我的代碼。 DbContext.ResourcesIMongoCollection<dynamic>,因爲它是高度非結構化的。如何在.NET中解析動態類型的ObjectId MongoDb驅動程序

var resource = await DbContext.Resources.Find(
    Builders<dynamic>.Filter.Eq("_id", ObjectId.Parse(id)) 
).SingleAsync(); 

,所得resource對象是

[{ 
    "_id": { 
    "timestamp":1487967980, 
    "machine":614561, 
    "pid":30862, 
    "increment":16022269, 
    "creationTime":"2017-02-24T20:26:20Z" 
    }, 
    ... 
}] 

什麼是解析這個_id的最佳做法?

+0

我可以問這個嗎?你是否在使用BSON庫,該庫與 c#驅動程序一起處理所有服務/請求。 https://www.nuget.org/packages/MongoDB.Bson/? – Veeram

+0

是的,我使用v = 2.4.3 –

+0

唯一的問題是我沒有任何註釋。該類型是動態的。沒有課。 –

回答

2

有多種方式來表示和構建ObjectId。對象從IMongoCollection對應回到實際_id值你在你的數據庫中看到的使用可以看出here及以下字段組成的構造編碼:

  • timestamp(INT)
  • machine哈希(INT)
  • pid(短)
  • increment(INT)

ObjectId應該實現一個ToString方法,允許您將對象轉換爲其字符串表示形式,但如果由於某種原因由於動態類型而無法使用它,則可以使用構造函數創建一個新對象,或者利用ObjectId.Pack方法,這將允許您將timestamp,machine,pidincrement轉換回字節數組,該數組也可以用於創建ObjectId

+0

有沒有最好的方式來處理這個查詢有很多結果。如果我單獨在1000條記錄上調用.ToString(),我擔心會出現嚴重的性能問題。 –

+2

查看多個資源後,我會說推薦的方法是使用註釋。由於在你的情況下這不是可能的,所以我會做一個小小的包裝函數來負責迭代你的集合並在每個項目上執行'ToString'。 1000個項目低於該點的表現將是一個問題。 –

相關問題