2

有谁知道是否可以使用水线关联填充另一个模型的 ID 列表?我试图让多对多关联工作,但我认为它不适用于这里,因为关系的一方不知道另一方。这意味着,一个用户可以是许多组的一部分,但组不知道哪些用户属于他们。例如,我目前正在使用 mongodb 中的数据模型,如下所示:

// Group
{
  _id: group01,
  var: 'somedata',
},
{
  _id: group02,
  var: 'somedata',
},
{
  _id: group03,
  var: 'somedata',
}

// User
{
  _id: 1234,
  name: 'Jim',
  groups: ['group01', 'group03']
}

而且我试图弄清楚是否可以设置具有关联的模型,以便在查询用户时返回以下内容:

// Req: /api/users/1234
// Desired result
{ 
  id: 1234,
  name: 'Jim',
  groups: [
    {
      _id: group01,
      var: 'somedata',
    },
    {
      _id: group03,
      var: 'somedata',
    }
  ]
}
4

1 回答 1

0

是的,sails 0.10.x 及以后版本支持关联。这是设置模型的方法

以下是您的用户模型的外观:

// User.js

module.exports = {

  tableName: "users",
  attributes: {

    name: {
      type: "string",
      required: true
    },

    groups: {
      collection: "group",
      via: "id"
    }

  }

};

以下是您的组模型的外观:

// Group.js
module.exports = {

  tableName: "groups",

  attributes: {

        name: {
            type: "string",
            required: "true"
        }   

  }

};

像这样设置模型将在您的数据库中创建三个表:

用户、组和 group_id__user_group

最后一个表由水线创建以保存关联。现在继续创建组。创建组后,继续创建用户。这是创建新用户的示例 POST 请求

{
  "name": "user1",
  "groups": ["547d84f691bff6663ad08147", "547d850c91bff6663ad08148"]
}

这将以以下方式将数据插入 group_id__user_group

{
    "_id" : ObjectId("547d854591bff6663ad0814a"),
    "group_id" : ObjectId("547d84f691bff6663ad08147"),
    "user_groups" : ObjectId("547d854591bff6663ad08149")
}

/* 1 */
{
    "_id" : ObjectId("547d854591bff6663ad0814b"),
    "group_id" : ObjectId("547d850c91bff6663ad08148"),
    "user_groups" : ObjectId("547d854591bff6663ad08149")
}

列 user_groups 是用户 ID。group_id 是组 ID。现在,如果您使用 GET 请求获取用户,您的响应将如下所示:

{
    "groups": [
        {
            "name": "group1",
            "createdAt": "2014-12-02T09:23:02.510Z",
            "updatedAt": "2014-12-02T09:23:02.510Z",
            "id": "547d84f691bff6663ad08147"
        },
        {
            "name": "group2",
            "createdAt": "2014-12-02T09:23:24.851Z",
            "updatedAt": "2014-12-02T09:23:24.851Z",
            "id": "547d850c91bff6663ad08148"
        }
    ],
    "name": "user1",
    "createdAt": "2014-12-02T09:24:21.182Z",
    "updatedAt": "2014-12-02T09:24:21.188Z",
    "id": "547d854591bff6663ad08149"
}

请注意,组没有嵌入到用户集合中。Waterline 会从组、用户和 group_id__user_group 中获取,以向您显示此结果。

此外,如果您想在控制器中执行此操作,则需要像这样执行

User.findOne({'id': "547d854591bff6663ad08149"})
.populate('groups')
.exec(function (err, user){
  // handle error and results in this callback
});

如果没有填充('groups'),您将无法获得组数组。希望这符合您的目的

于 2014-12-02T09:35:04.380 回答