在现有数据库上与 keystone 创建多对多关系

creating many to many relationship with keystone on existing database

我想在现有数据库中添加对象引用。 现在我有两个数据库(域和 LabConfigs)和 运行 并且它们都有我可以从 robomongo 看到的实例。

LabConfig 看起来像这样

         id_:12345 (objectId)
         labConfig: test1
         id_:67890 (objectId)
         labConfig: test2

域名看起来像这样

         id_:8787897 (objectId)
         domainName:ggogle.com
         id_:34234234 (objectId)
         domainName:fb.com

现在,当我使用以下架构启动 keystone 时。

****************LabConfigs***********************
var LabConfigs = new keystone.List('LabConfigs');

LabConfigs.add({
 configName: {type: Types.Text, required: true, initial: true, index: true}
});
 LabConfig.defaultColumns = 'configName';
 LabConfig.register();

************************************************

这是我的第二个数据库。

var Domain = new keystone.List('Domain');

Domain.add({
  domainName: {type: Types.Text, required: true, initial: true, index: true},
  labConfigs :{type: Types.Relationship, ref: 'LabConfigs',required: false,many: true},
   userauthlevel:{ type: Types.TextArray}
  });


Domain.defaultColumns = 'domainName';
Domain.register();

现在我想要的是将 labConfigs 作为数组添加到域数据库中。即每个 labConfigs 都与域数组有关系。

在基石

  1. 从何处添加 keystone 开始,即建立这种多对多关系?
  2. 我应该在那个 ( init ) 函数中建立这种关系的查询是什么?

答案 1 --> 我搜索了太多并发现将它放在

中是个好主意
 view.on('init', function())}

您的 Domain 模型上有 labconfigs 字段,并且您已在其上设置 many: true。现在您可以在 Domain 文档上指定一个 LabConfig ID 数组。保存 Domain 时,可以将 labConfigs 设置为等于 labConfig 文档 ID 的数组。您还可以自己创建一个 labConfig 数组,而不是它们的 ID。 Keystone 将以相同的方式保存对对象的引用。

view.on('post', function (next) {
    var labConfigIDs = []; // Array of labConfig IDs, created however you want
    domain.getUpdateHandler(req).process({
        labConfigs: labConfigIDs
    }, {
        flashErrors: true,
        errorMessage: 'There was a problem updating your domain.'
    }, function(err) {
        if (err) {
            req.flash("error", saveErr.message);
            return next();
        } else {
            req.flash('success', 'Your changes have been saved.');
            return next();
        }
    });
});