在C#中基于BsonId查询MongoDb数据

时间:2017-06-16 10:38:57

标签: c# .net mongodb bson

我正在通过Plural Sight课程来深入了解MongoDB。这是“路径”的基础课程之一,它似乎是在2.0之前制作的。因此,我很难理解导师正在经历的一些科目。

我希望看看是否有人可以根据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); 
    }

此语法不允许我构建项目,因为没有名称为_id的属性。我还尝试了一个实际的属性ID,但这似乎在构建时会产生某种问题(很可能是因为我已经有了一个ID,由BsonID创建)。

如果以前曾问过这个问题,我真的很抱歉,但我真的找不到任何关于这个问题的帮助。似乎应该有很多资源(即。我们的新手应该能够在搜索像“c#查询mongodb找到BsonId”)这样的东西时获得一些好的资源。

我完全明白这是否会被投票决定,但如果有时间的人可以帮助我,我真的很喜欢。

2 个答案:

答案 0 :(得分:0)

您正在整理一个C#查询,该查询无法了解您在POCO上的属性[BsonElement("_id")]中指定的MongoDB映射。

你想要的是

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

编辑(澄清):

MongoDB C#驱动程序将剖析过滤器表达式pat => pat.Name == id,并根据POCO上的属性,它将为您创建一个MongoDB查询,使用&#34; _id&#34;字段。

答案 1 :(得分:0)

Mongo的C#驱动程序需要一个id字段(以某种方式唯一标识您的文档)。这可以通过约定来确定,也可以由您明确指定。

按照惯例,如果你有一个名为Id的ObjectId类型的公共成员的类,那么Mongo的C#驱动程序将假设这是你的id,它将被映射到Mongo集合中名为a -> b的字段。

例如:

_id

如果您因某些原因不想使用约定(例如,如果您使用的是自然键,那么您可以使用BsonId属性告诉Mongo驱动程序您想使用其他字段/类型作为您的ID。

例如:

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

或使用ObjectID以外的类型:

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