C # MongoDB Query с BsonClassMaps - PullRequest
       26

C # MongoDB Query с BsonClassMaps

2 голосов
/ 10 апреля 2011

Я новичок в MongoDB, и мне было интересно узнать о запросах объектов домена с зарегистрированными BsonClassMaps.Рассмотрим следующие сопоставления:

BsonClassMap.RegisterClassMap<VoyageNumber>(cm =>
            { cm.MapField<string>(p => p.Id); });

BsonClassMap.RegisterClassMap<Schedule>(cm =>
        { cm.MapField<DateTime>(p => p.EndDate); cm.MapField<DateTime>(p => p.StartDate); });

BsonClassMap.RegisterClassMap<Voyage>(cm =>
            { cm.MapIdField<VoyageNumber>(p => p.VoyageNumber); cm.MapField<Schedule>(p => p.Schedule); });

Доменным объектом является «Voyage».В этом простом примере он состоит из сложного типа «Расписание» (с датой начала и конца) и VoyageNumber (с полем идентификатора строки).«VoyageNumber» - это идентификатор объекта.

Теперь я могу просто добавить новый рейс с помощью:

MongoCollection<Voyage> mongoVoyages = context.MyDB.GetCollection<Voyage>("Voyages");

mongoVoyages.Insert<Voyage>(voyage);

Я могу получить один рейс с помощью:

MongoCollection mongoVoyages = context.MyDB.GetCollection("Voyages");

BsonDocument result = mongoVoyages.FindOneAs<BsonDocument>();
BsonDocument sched = result["Schedule"].AsBsonDocument;
DateTime start = sched["StartDate"].AsDateTime;
//etc...

Теперь, конечно, я бы хотел найти рейс по Id.Как я могу добиться этого с помощью отображений, показанных выше?Я попробовал что-то подобное и потерпел неудачу:

Query.EQ("VoyageNumber", someStringID)

Я использую официальный драйвер C # 1.0.

1 Ответ

1 голос
/ 10 апреля 2011

При регистрации выше классов у вас будет такой документ в mongodb:

{
  "_id": {
    "_id": someStringID
  },
  "Schedule": {
    "EndDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00",
    "StartDate": "Sun, 10 Apr 2011 13:06:25 GMT +03:00"
  }
}

Так что, если вы хотите получить Voyage по VoyageNumber Id, вы должны использовать следующий запрос:

Query.EQ("_id._id", someStringID)

Примечание: Вам не нужно BsonClassMap.RegisterClassMap для класса, если вы сопоставите все поля, потому что он будет сериализован по умолчанию без какой-либо регистрации. Также вы можете выполнить пользовательскую сериализацию, используя такие атрибуты, как [BsonId], [BsonIgnore]. Для более подробной информации ознакомьтесь с документацией или задайте другой вопрос;).

Из документации:

Вы можете создать эту карту классов самостоятельно или просто разрешить карту классов создается автоматически при первом необходимо (называется «autopping»). Вы можете осуществлять некоторый контроль над процесс автоматизации либо украшать ваши классы атрибуты, связанные с сериализацией или используя код инициализации (атрибуты очень удобны в использовании, но для те, кто предпочитает вести сериализацию детали из их классов доменов будут заверил, что все, что можно сделать с атрибутами тоже можно сделать без них)

...