【问题标题】:Web API Get with query parameters on Mongodb collectionWeb API Get 与 Mongodb 集合上的查询参数
【发布时间】:2018-01-04 15:53:35
【问题描述】:

我编写了 WebAPI,它使用 mongodb 集合作为数据库。 看起来像

[
   {
      "Id":"5a449c148b021b5fb4cb1f66",
      "airline":[
         {
            "airlineID":-1,
            "airlineName":"Unknown",
            "airlineAlias":"",
            "airlineIATACode":"-",
            "airlineICAOCode":"N/A",
            "airlineCallsign":"",
            "airlineBaseCountry":"",
            "airlineActiveIndicator":"Y"
         },
         {
            "airlineID":1,
            "airlineName":"Private flight",
            "airlineAlias":"",
            "airlineIATACode":"1T",
            "airlineICAOCode":"N/A",
            "airlineCallsign":"",
            "airlineBaseCountry":"",
            "airlineActiveIndicator":"Y"
         },
         {
            "airlineID":2,
            "airlineName":"135 Airways",
            "airlineAlias":"",
            "airlineIATACode":"2T",
            "airlineICAOCode":"GNL",
            "airlineCallsign":"GENERAL",
            "airlineBaseCountry":"United States",
            "airlineActiveIndicator":"N"
         }
      ]
   }
]

我正在尝试使用航空公司IATACode 属性获取数据

public airlineModel Get(string i)
        {           
            _collection = _db.GetCollection<airlineModel>("airline");

            var res = Query<airlineModel>.EQ(p => p.airline[0].airlineIATACode, i);            
            return _collection.FindOne(res);
        } 

我的控制器实现

public HttpResponseMessage Get(string IATAcode)
        {
            var result = objds.Get(IATAcode);
            if (result != null)
                return Request.CreateResponse(HttpStatusCode.OK, result);
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Data not found");

        } 

我的模型类:

public class airlineModel
    {
        public ObjectId Id { get; set; }

        [BsonElement("airline")]
        public List<airlinedata> airline { get; set; }
    }



public class airlinedata
{
    [BsonElement("airlineID")]
    public int airlineID { get; set; }
    [BsonElement("airlineName")]
    public string airlineName { get; set; }
    [BsonElement("airlineAlias")]
    public string airlineAlias { get; set; }
   [BsonElement("airlineIATACode")]
    public string airlineIATACode { get; set; }
    [BsonElement("airlineICAOCode")]
    public string airlineICAOCode { get; set; }
    [BsonElement("airlineCallsign")]
    public string airlineCallsign { get; set; }
    [BsonElement("airlineBaseCountry")]
    public string airlineBaseCountry { get; set; }
    [BsonElement("airlineActiveIndicator")]
    public string airlineActiveIndicator { get; set; }
}

当我运行应用并浏览http://localhost:60387/api/airlineAPI?IATAcode=1T

它说,找不到数据

我能做些什么来解决这个问题?

【问题讨论】:

    标签: mongodb asp.net-web-api c#-4.0


    【解决方案1】:

    你可以试试这个。

    public airlinedata Get(string i)
    {
        var _collection = database.GetCollection<airlineModel>("airline");
    
        var filter = Builders<airlineModel>.Filter
            .ElemMatch(model => model.airline, airline => airline.airlineIATACode == i);
    
        var projection = Builders<airlineModel>.Projection
            .Include(model => model.airline[-1]);
    
        var airlineModel = _collection.Find(filter)
            .Project<airlineModel>(projection)
            .Single();
    
        return airlineModel.airline.Single();
    }
    

    请注意,您不需要在每个字段上放置映射属性。默认映射与您对属性所做的完全一样。

    我建议您使用的唯一属性是 [BsonId] 来告诉 MongoDB 哪个是您的 _id 字段。

    public class airlineModel
    {
        [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
        public ObjectId Id { get; set; }
    
        ...
    }
    

    最后,如果集合很大,不要忘记在airlineIATACode 字段上创建索引,否则搜索会执行昂贵的 COLLSCAN。

    【讨论】:

    • Argument 1: cannot convert from 'MongoDB.Driver.FilterDefinition' to 'MongoDB.Driver.IMongoQuery' MongoWebAPIAirline ...在这一行出现此错误 ...return _collection.Find(filter).Single();
    • 我正在使用 MongoDB.Driver v2.5.0。 IMongoQuery 接口已弃用,取而代之的是 FilterDefinition&lt;T&gt;
    • 试过这个...但是它返回整个数据...它没有使用 IATAcode 过滤
    • 您需要匹配的航空公司吗?不是整个航空公司模型至少有一个元素匹配?事实上,在这种情况下,Get 方法应该返回航空公司,而不是航空公司模型。
    • 是的,我需要匹配的航空公司......如果你看到我的 JSON,你可以看到有一个航空公司 IATAcode ="1T" 的条目......所以它应该匹配......这个 get 方法正在返回 entrire航空公司型号而不是特定航空公司
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多