Loopback JS:重命名现有模型

时间:2016-01-28 07:36:10

标签: mongodb loopbackjs

我正在使用Loopback API框架,这是一个新手。

我有一个先前由Loopback创建的现有模型,我们称之为OldModelName。我想将其重命名为NewModelName

我已有现有数据,其他多个模型已经引用它:

相关-model.json

  "relations": {
    "oldModel": {
      "type": "belongsTo",
      "model": "OldModelName",
      "foreignKey": ""
    }
  }

在不丢失数据的情况下重命名/重构模型的最佳方法是什么?我不认为最好的方法是登录Mongo shell并手动重命名,但我不能挖掘任何能告诉我的东西。

2 个答案:

答案 0 :(得分:1)

将我之前的评论放在答案中并添加一点......

没有简单的方法可以做到这一点,你只需要浏览所有配置文件并更新名称。 (包括common/models以及server/model-config.json以及您通过名称引用模型的任何其他地方的内容)

如果您已经持久存储数据,那么您遇到了更大的问题。例如,如果它是MySQL,则需要重命名外键字段并更新任何FK限制或触发器。如果它是Mongo,您将需要扫描相关连接以重命名该FK对象属性。

或者,您可以保留数据库结构,只需在LoopBack方面重命名模型,但您仍需要在LoopBack中使用自定义外键名称,并使用data source specific options更新模型配置。 / p>

答案 1 :(得分:1)

我终于有勇气做到这一点,这是我采取的步骤:

  1. 备份数据库
  2. 杀死服务器
  3. 编辑model-config.json
  4. 编辑模型定义JSON和模型JS(old-model.json& 老model.js)。一定要将它们重命名为new-model.json等
  5. 编辑所有关系/相关模型
  6. 编辑所有启动脚本/操作挂钩/ etc
  7. 现在已经更新了Loopback代码,必须相应地更新Mongo DB:

    mongo>
    
    //Make sure the new collection we are migrating to is empty
    db.NewCollection.drop();
    
    //Copy all entries from OldCollection to NewCollection
    db.OldCollection.find().forEach( function(x){db.NewCollection.insert(x)} );
    
    //Update relations, for hasOne related models
    db.RelatedCollection.update( {}, { $rename: { 'oldCollectionId': 'newCollectionId'} }, { multi: true} );
    
    //Update relations, for hasAndBelongsToMany related models
    db.NewCollectionRelatedCollection.drop();
    db.OldCollectionRelatedCollection.find().forEach( function(x){db.NewCollectionRelatedCollection.insert(x)} );
    db.NewCollectionRelatedCollection.update( {}, { $rename: { 'oldCollectionId': 'newCollectionId'} }, { multi: true} );
    
    //Feeling confident?
    db.OldCollection.drop();
    db.OldCollectionRelatedCollection.drop();
    

    小小的神经紧张,但在采取这些步骤并重新启动服务器后,一切正常,除了一些地方我忘了更改命名。这是我第一次"重构"在数据库中的某些东西,希望我忽略了一个更简单的方法来做到这一点,但这是我迄今为止最好的。