Как выполнить миграцию mongoDB, когда модель представляла собой конкретный тип, а теперь является интерфейсом - PullRequest
0 голосов
/ 12 декабря 2018

Я использую драйвер MongoDB C # версии 2.4.4.

У меня проблемы с переносом старых документов, которые были основаны в конкретном типе, в новую модель, основанную на интерфейсе.

В начале модель была примерно такой:

public class DeliveryRoute : MongoDbItem
{
    ...
    public List<Step> Steps { get; set; }
    ...
}

Теперь мне нужно было воспользоваться интерфейсом, и новый код выглядит так:

public class DeliveryRoute : MongoDbItem
{
    ...
    public List<IStep> Steps { get; set; }
    ...
}

Когда я сохраняю новые документы,MongoDB Driver сохраняет поле с именем "_t", которое содержит конкретный тип.

enter image description here

Проблема в том, что у меня уже есть некоторые документы, которые не имеютэто поле.Я думал, что решение было простым, затем я создал этот скрипт, чтобы добавить новое поле для каждой имеющейся у меня коллекции:

db.getCollection('MongoDBDeliveryRouteCollection').find({"UnitCode":"016302", "_id":"01630220181030013818"})
.forEach(function(deliveryRouteDocument){

        deliveryRouteDocument.Steps.forEach(function(step){

              if(!step.hasOwnProperty('_t')){
                  step._t = "Step";
              }
        });
       db.getCollection('MongoDBDeliveryRouteCollection').save(deliveryRouteDocument);
    })

Поле было создано.

Но кажется, что драйверигнорирование "_t" при его создании скриптом.В результате возникает ошибка:

Невозможно определить фактический тип объекта для десериализации для типа интерфейса PathTracker.Common.Interfaces.IStep.

Кто-то имеет представление о том, что яделать неправильно?

...