2017-06-16 57 views
-1

我正在通過複數視域課程學習MongoDB中的一些知識。這是'路徑'的基本課程之一,它似乎已經在2.0之前。因此,我在理解導師所經歷的一些主題方面遇到了一些麻煩。在C中查詢基於BsonId的MongoDb數據#

我希望看到有人可以澄清如何Find任何對象基於他們的BsonID

這是我的目標:

public class Patient 
{ 
    [BsonElement("_id")] 
    [BsonId] 
    public string Name { get; set; } 
    public ICollection<Ailment> Ailments { get; set; } 
    public ICollection<Medication> Medications { get; set; } 
} 

這是我怎樣,我想查詢它:

public HttpResponseMessage Get(int id) 
    { 
     var patient = _patients.Find(pat => pat._id == id).ToList(); 
     if(patient == null) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Patient Not Found.."); 
     } 
     return Request.CreateResponse(HttpStatusCode.OK, patient); 
    } 

這句法不允許我建立這個項目,因爲」不是個t名爲_id的房產。我也嘗試了一個實際的屬性ID,但是這似乎在構建時會產生某種問題(很可能因爲我已經有一個ID,由BsonID創建)。

如果以前有人問過這個問題,我真的很抱歉,但我真的無法找到任何關於這個問題的幫助。似乎應該有很多資源(例如,我們的新手應該能夠獲得一些良好的來源,當搜索的東西,如「c#查詢mongodb發現BsonId」)。

我完全理解這是否會被選中,但如果某人有一段時間可以幫助我在這裏,我真的很喜歡它。

+0

我認爲這[已回答](https://stackoverflow.com/questions/ 6063219 /如何管理的-ID-場時-使用-POCO與 - mongodb的-C-銳驅動程序)。 –

+0

糾正我,如果我錯了,但不是'ObjectId'棄用?至少當我試圖使用它而不是'BsonId'時,它拋出了一個錯誤,指出在'BsonTypes'(或類似的東西)中沒有這個名字的屬性。 – geostocker

+0

ObjectId是一種類型(如int或字符串),非常適合Mongo中的Id屬性...雖然在我們最近的項目中,我們已經使用Guid而不是ObjectId,因爲我們不想將所有模型緊密結合到Mongo(如果我們想更改持久層)。 BsonId是如果您不想使用默認的'public ObjectId Id {get;}來裝飾您的Id字段的屬性(BsonIdAttribute)組; ''。 –

回答

0

您正在彙總一個C#查詢,它不知道您在POCO上的屬性[BsonElement("_id")]中指定的MongoDB映射。

你想要的是

var patient = _patients.Find(pat => pat.Name == id).FirstOrDefault(); 

編輯(澄清):

MongoDB的C#驅動程序將剖析篩選表達式pat => pat.Name == id,並根據您的POCO的屬性它會創建一個MongoDB的爲您查詢使用「_id」字段。

0

Mongo的C#驅動程序需要一個id字段(以某種方式唯一標識您的文檔)。這可以通過約定來確定或由您明確指定。按照慣例,如果您有一個類ObjectId的公共成員名爲Id的類,那麼Mongo的C#驅動程序將假設這是您的id,並且它將映射到您的Mongo集合中名爲_id的字段。

例如:

public class Widget 
{ 
    public ObjectId Id { get; set; } 
    public string Foo { get; set; } 
} 

如果你不想用常規去出於某種原因(例如,如果你有一個自然的關鍵,你寧願使用),那麼你可以使用BsonId屬性告訴Mongo驅動程序你想使用其他字段/類型作爲你的Id。

例如:

public class Widget 
{ 
    [BsonId] 
    public ObjectId WidgetId { get; set; } 
    public string Foo { get; set; } 
} 

或者用比其他對象ID類型:

public class Widget 
{ 
    [BsonId(IdGenerator=typeof(StringObjectIdGenerator))] 
    public string WidgetId { get; set; } 
    public string Foo { get; set; } 
}