【问题标题】:Querying MongoDb Data based on BsonId in C#C#中根据BsonId查询MongoDb数据
【发布时间】:2017-11-19 02:38:43
【问题描述】:

我正在学习 Plural Sight 课程,以深入了解 MongoDB。它是“路径”上的基础课程之一,似乎是在 2.0 之前制作的。因此,我在理解导师正在学习的一些科目时遇到了一些困难。

我希望看看是否有人可以根据他们的BsonID 澄清如何Find 任何对象?

这是我的对象:

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 的属性。我也尝试使用 actual 属性 ID,但这似乎在构建时会产生某种问题(很可能是因为其中已经有一个由 BsonID 创建的 ID)。

如果以前有人问过这个问题,我真的很抱歉,但我真的找不到关于这个问题的任何帮助。看起来上面应该有很多资源(即我们新手在搜索 "c# querying mongodb find on BsonId" 之类的东西时应该能够得到一些好的资源)。。 p>

我完全理解这是否会被否决,但如果有时间的人可以在这里帮助我,我真的很高兴。

【问题讨论】:

  • 我认为这里有already been answered
  • 如果我错了,请纠正我,但ObjectId 不是已弃用吗?至少当我尝试使用它而不是 BsonId 时,它向我抛出了一个错误,提示 BsonTypes(或类似名称)中没有具有该名称的属性。
  • ObjectId 是一种非常适合 Mongo 中的 Id 属性的类型(如 int 或 string)......尽管在我们最近的项目中,我们使用 Guid 而不是 ObjectId 因为我们不想要将我们所有的模型紧密耦合到 Mongo(以防我们想要更改持久层)。 BsonId 是如果您不想使用默认的 public ObjectId Id{ get; set; } 来装饰您的 Id 字段的属性 (BsonIdAttribute)。

标签: c# .net mongodb bson


【解决方案1】:

您正在组合一个 C# 查询,该查询不知道您在 POCO 的属性 [BsonElement("_id")] 中指定的 MongoDB 映射。

你想要的是

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

编辑(澄清):

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

【讨论】:

    【解决方案2】:

    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; }
    }
    

    或者使用ObjectID以外的类型:

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

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多