Rajiv Krishnaa
Rajiv Krishnaa

Reputation: 99

Web API Get with query parameters on Mongodb collection

I have WebAPI written and it is using mongodb collection as a database. it looks like

[
   {
      "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"
         }
      ]
   }
]

I'm trying to get data using airlineIATACode attribute

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

My controller implementation

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");

        } 

My Model class:

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

When I run app and browse http://localhost:60387/api/airlineAPI?IATAcode=1T

it says, Data not found

What can I do to solve this problem?

Upvotes: 1

Views: 678

Answers (1)

Marcello
Marcello

Reputation: 919

You can try this.

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

Note that you don't need to put mapping attributes on each field. The default mapping does exactly what you did with attributes.

The only attribute I suggest you to use is [BsonId] to tell MongoDB which is your _id field.

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

    ...
}

Finally, in case of a large collection, don't forget to create an index on airlineIATACode field, otherwise the search would perform an expensive COLLSCAN.

Upvotes: 1

Related Questions