Sailsjs。在sails-mongo(mongodb)上创建(和管理)索引的最佳方法

时间:2018-05-15 22:05:34

标签: mongodb sails.js waterline sails-mongo

我使用的是sailsjs 0.12。它还支持index上的models个属性 我正在使用npm包Sails-hooks-mongoat来创建反向索引等等。

这不是理想的,但它有效。现在他们删除了index属性,mongoat目前是不安全的,等待更新可以在Sails.js 1.0上运行。

我想知道最好的方法:

  • 在新部署中创建索引。
  • 迁移(确保?)部署更新的索引。

2 个答案:

答案 0 :(得分:1)

在开发模式下,您可以在Sails中的模型中指定自定义索引,否则它将在提升服务器和执行迁移时将其删除。

我的(首选)替代方法是在数据库中自行管理所有索引。为此,必须在models.js配置文件中将“迁移”属性从“更改”更改为“安全”。

请注意,在生产模式下,“ migrate”属性始终设置为“ safe”。

答案 1 :(得分:1)

由于不允许在生产环境中运行“ migrate:alter”(即使尝试),因此一种选择是在引导文件(“ config / bootstrap.js”)中创建这些索引。

想象一下,您有一个这样的用户模型:

var User = {
  attributes: {
    email     : { type: 'string', unique: true, required: true },
    username  : { type: 'string', unique: true, required: true },
    pin: { type: 'string'}
  }
};

module.exports = User;

然后,您可以在引导文件中手动创建缺少的索引,如下所示:

module.exports.bootstrap = async function(done) {
  console.log("Loading bootstrap...")

  if (process.env.NODE_ENV === 'test') {

  }

  if (process.env.NODE_ENV === 'production') {
      console.log("CREATING DATABASE INDEX BY HAND")

      // USER MODEL
      var db = User.getDatastore().manager;
      await db.collection(User.tableName).createIndex( { email: 1 }, {unique: true} );
      await db.collection(User.tableName).createIndex( { username: 1 }, {unique: true} );
      // PANDA MODEL
      // db = Panda.getDatastore().manager;
      // await db.collection(Panda.tableName).createIndex( { name: 1 }, {unique: true} );
  }

  // await initializeDatabase() // custom DB initialization...

  return done();
};

索引仅创建一次,后续运行将不会重新创建那些索引。 ensureIndex是createIndex函数的别名,已被弃用。

参考:

Waterline manager reference

MongoDB create index reference