Как перенести данные JSON устаревшей области в область MongoDB (Atlas) — проблема с отношениями

#mongodb #realm #realm-mobile-platform #realm-migration

#mongodb #realm #realm-мобильная платформа #область-миграция

Вопрос:

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

Пример схемы:

 {
  name: 'Location',
  primaryKey: '_id',
  properties: {
    _id: 'string',
    _partition: 'string?',
    Name: 'string',
    WorkTime: 'WorkTime[]',
  },
}

{
  name: 'WorkTime',
  primaryKey: '_id',
  properties: {
    _id: 'string',
    _partition: 'string?',
    Day: 'string?',
    Open: 'string?',
    Closed: 'string?',
  },
}
 

В каком формате я должен отправить json в MongoDB Atlas, чтобы он связывался со связанными данными?

Я попытался добавить идентификаторы (со строкой раздела и без нее) из моей WorkTime коллекции, следуя https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

Пример JSON:

 {  
   "_id":"adaaade7-2b4f-5342-92a1-f00857a61253"
   "_partition":"TestPartition",  
   "Name":"Test",    
   "WorkTime":[
      {
         "_partition":"TestPartition",
         "_id":"1229ac83-f390-00e3-14a7-ffa9f8eb36e4"
      },
      {
         "_partition":"TestPartition",
         "_id":"9af60ff2-064b-3f09-6621-e7f949b003be"
      },
      {
         "_partition":"TestPartition",
         "_id":"04c33a8c-5e59-45ab-fbf8-e70446324475"
      },   
   ],     
}
 

И когда я пытаюсь извлечь данные из realm ( realm.objects('Location') ), я ничего не получаю. Местоположения отображаются только тогда, когда WorkTime они пусты.

Я также попытался передать весь WorkTime объект вместо идентификатора, но затем он создает копию полного объекта.

Комментарии:

1. Вам не нужно много делать, чтобы перенести файл Realm для использования с MongoDB Realm. Объекты должны иметь _id, что вы и сделали, а затем вы можете включить свойство PartitionKey в фактический объект. Это также должно быть определено в консоли Realm. Какое отношение raw JSON имеет к процессу миграции?

2. Мне нужно перенести данные из устаревшей области в MongoDB Atlas docs.realm.io/realm-legacy-migration-guide/#migrating-data

Ответ №1:

Я понимаю, что объекты, на которые ссылаются, должны быть строками идентификаторов, как в примере. https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

Итак, если у вас есть

 {  
   "_id":"adaaade7-2b4f-5342-92a1-f00857a61253"
   "_partition":"TestPartition",  
   "Test": {"_id":"9af60ff2-064b-3f09-6621-e7f949b003be", "_partition":"TestPartition"},
   "WorkTime":[
      {
         "_partition":"TestPartition",
         "_id":"1229ac83-f390-00e3-14a7-ffa9f8eb36e4"
      },
   ],     
}
 

должен быть преобразован в

 {  
   "_id":"adaaade7-2b4f-5342-92a1-f00857a61253"
   "_partition":"TestPartition",  
   "Test": "9af60ff2-064b-3f09-6621-e7f949b003be",
   "WorkTime":[
     "1229ac83-f390-00e3-14a7-ffa9f8eb36e4"
   ],     
}
 

Оставляя только идентификаторы в виде строк.

Я рекурсивно повторил объекты, удалил неидентифицированные реквизиты вложенных объектов, заменил Id на _id и добавил ключ раздела. После этого вам нужно заменить вложенные объекты на string {"_id":"9af60ff2-064b-3f09-6621-e7f949b003be"} -> 9af60ff2-064b-3f09-6621-e7f949b003be .

Комментарии:

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

2. Да, я использую полную синхронизацию. Какими будут точные шаги для переноса данных? 1) откройте область устаревшей синхронизации, чтобы она загружала файлы 2) замените id на _id и добавьте _partition в модель 3) обновите до области 10 4) откройте область синхронизации mongodb с соответствующим значением partitionValue (если оно было realmUrl/test в legacy, должно ли оно быть /test или только test в mongo)? 5) данные будут перенесены автоматически?

3. Я не знаю, какими были ваши предыдущие версии, но вы можете просто открыть файл realm с помощью Realm Studio, чтобы обновить его. Я бы сделал копию вашего локального файла и попробовал это. В противном случае имейте в виду, что переход в область MongoDB имеет другую локальную файловую структуру. Так, например, у вас мог быть вызван локальный файл default.realm , который был полностью синхронизирован с облаком устаревшей области. При использовании MongoDB Realm структура будет сильно отличаться, поскольку каждый файл «realm» хранится по разделам.

4. Я использую версию 6.1.5. Мои синхронизированные файлы realm-object-serverguid без расширения, с . заблокируйте или очистите папки. Это действительно сбивает с толку, я думал, что realm studio может работать только с устаревшими файлами. Пошаговое руководство было бы действительно полезным (что-то похожее на то, что я написал в своем предыдущем комментарии).

5. Сервер / браузер объектов legacy Realm будет работать только с файлами legacy Realm. Затем он стал Realm Studio, который будет работать только с устаревшими файлами. Как только Realm Studio (прокрутите вниз, чтобы прочитать новости выпуска) была обновлена до версии 4.0.0, она будет работать с новыми файлами (формат файла v10), а также обновлять старые файлы.