Query attached documents using C # MongoDB

I have a document called Record

that contains Athlete

as a subdocument. The structure looks like this in JSON:

{
  "Id": "000000000000000000000000",
  "Description": "sample string 1",
  "Athlete": {
    "Id": "123456789101112131415161",
    "Name": "sample string 2",
    "Username": "sample string 3",
    ...
  },
  ...
}

      

How do you query this structure to retrieve an object Record

based on Athlete.Id

? I.E. If I have an Athlete ID and want to get their record, how do you do it?

+3


source to share


3 answers


Method 1 : using raw BsonDocument: (it will return a list BsonDocument

)

var queryString = Query.EQ("Athlete.Id", "123456789101112131415161");
var resultBsons = collection.Find(queryString).ToList();

      

Way 2 . Another way is to use the typed version of the mongodb C # driver:

define 2 classes:



public class Athlete
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
}

public class Record
{
    public string Id { get; set; }
    public string Description { get; set; }
    public Athlete Athlete { get; set; }
}

      

then make your request

var url = new MongoUrl("mongodb://localhost");
var client = new MongoClient(url);
var server = client.GetServer();
var database = server.GetDatabase("test");
var collection = database.GetCollection<Record>("records");

var query = Query<Record>.EQ(i => i.Athlete.Id, "123456789101112131415161");
var result = collection.Find(query).ToList();

      

+4


source


Besides what has already been said, blog can help you in more complex situations. Basically it might look like this:



records.Find(
  Query.ElemMatch("Athlete",
  Query.EQ("Id", athleteId)
));

      

+2


source


You can request a sub-document field, using exactly the format that you specify: Athlete.Id

.

db.collection_name.findOne({"Athlete.Id": "123456789101112131415161"})

      

EDIT: To do this in C #, you can do something like this, assuming you have defined your Record document structure in a class named Record

:

IMongoQuery query = Query.EQ("Athlete.Id", "123456789101112131415161");
Record result = collection_name.FindOne(query); 

      

Or if multiple documents can be returned using an appropriate identifier:

IMongoQuery query = Query.EQ("Athlete.Id", "123456789101112131415161");
MongoCursor<Record> resultCursor = collection_name.FindOne(query); 

      

+1


source







All Articles