【问题标题】:LoopBack Relationships环回关系
【发布时间】:2017-08-23 17:56:16
【问题描述】:

这是我第一次处理 NoSQL 形式的数据库,我对面向文档的数据库中的“关系”有点困惑。我正在使用 LoopBack 和 AngularJS。

我有一个模型 pagehas many page,因为它是 children(即菜单项和子菜单)。

page模型如下:

"properties": {
 "name": {
   "type": "string",
   "required": true
 },
 "slug": {
   "type": "string"
 },
 "link": {
   "type": "string"
 },
 "createdAt": {
   "type": "date",
   "required": true
 },
 "children": {
   "type": [
     "object"
   ]
 }
},

"relations": {
 "children": {
   "type": "hasMany",
   "model": "page",
   "foreignKey": "parentId"
 }
},

我的困惑是,每当我 explore LoopBack API,然后 get parent 页面时,我都没有看到 children 属性填充。但是,执行get 来查看父母的孩子(使用父母的id)结果很好 - 我可以看到parentId 填充了它的父母。

我的问题是在处理 NoSQL/面向文档的数据库时这是否正常,还是我做错了什么?

非常感谢!

【问题讨论】:

    标签: mongodb loopbackjs strongloop


    【解决方案1】:

    当涉及到关系和并行查询时,有时 LoopBack 查询会变得混乱。

    我认为这只是 LoopBack 中的一个查询问题。

    我意识到这就像父页面对象可以有多个子页面对象。

    我们可以使用以下查询语句来检索相关的父页面和子页面。

    app.models.Page.find({ 在哪里: { parentId : '你的页面 ID' }, 包括: { 关系:“儿童” } },功能(错误,页面){ 如果(错误){ CB(错误); } 别的 { console.log("您将单独获得相关的子页面和父页面") cb(空,页); } });

    希望这会奏效...!!

    【讨论】:

      【解决方案2】:

      我相信你可能错过了关系的另一个方向。

      您可以在孩子中使用belongsTo relation 来指定它属于父母。

      这应该使您能够在资源管理器中看到两个方向的方法。

      另外,foreingKey parentId 应该设置在孩子身上,而不是父母身上。 IE。在父 relations 定义上将 foreignKey 留空,而在 children 关系定义上使用它。

      因此,一方面,在模型中,您将拥有关系字段:

       "children": {
         "type": "hasMany",
         "model": "page",
         "foreignKey": ""
       },
      

      还有

      "parent": {
          "type": "belongsTo",
          "model": "page",
          "foreignKey": "parentId"
       },
      

      加上你拥有的任何其他关系。

      我已经对此进行了测试并且它有效,尽管我为关系使用了两种不同的模型,而不是只使用一种。

      即我用

      ModelA hasMany ModelBModelB belongsTo ModelA

      而不是

      ModelA hasMany ModelAModelA belongsTo ModelA

      【讨论】:

      • 这是否意味着我必须创建一个新模型(如childPage)才能做到这一点?因为基本上,page 作为父级和page 作为子级,都是完全相同的模型。
      • 不知道用同一个模型行不行,你需要试试。但如果没有,那么我认为您确实需要创建一个新模型。但是,我认为创建另一个模型也有其他优势。即使它们现在是一样的,如果它们将来改变呢?另外,过滤器之类的不是更容易吗?
      【解决方案3】:

      在猫鼬中,当您想要填充页面的“子项”时,您需要使用以下命令专门要求它:

      Pages.find({})
        .populate('children')
        .exec(function(err, pages){
           //..
        })
      

      查看 LoopBack 的页面 (http://loopback.io/doc/en/lb2/Querying-related-models.html) 有类似的东西叫做“包含”,你应该尝试这样做:

      Page.find({include:'children'}, function() {
        //...
      });
      

      让我知道这是否有效!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 2023-01-20
        • 2015-08-17
        • 2017-01-28
        相关资源
        最近更新 更多