LoopBack关系

时间:2016-11-22 19:06:14

标签: mongodb loopbackjs strongloop

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

我的模型page has 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 /面向文档的数据库时,这是正常的,还是我做错了什么?

非常感谢!

3 个答案:

答案 0 :(得分:3)

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

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

我意识到这就像Parent Page对象可以有多个Children页面对象。

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


    app.models.Page.find({
            where: {
              parentId : 'yourPageId'
            },
            include: {
              relation: 'Children'
            }

          }, function (err, pages) {
            if (err) {
              cb(err);
            } else { 
              console.log("you will get related children pages alone with parent page")
              cb(null, pages);
            }
    });

希望这会有用...... !!

答案 1 :(得分:1)

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

您可以在子项中执行belongsTo relation以指定它属于父项。

这应该可以让你看到两个方向'探险家的方法。

此外,foreingKey parentId应设置在子项上,而不是父项。即将foreignKey留在父relations定义上为空,而是在children关系定义中使用它。

所以一方面,在模型中你将进入关系领域:

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

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

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

我已经测试了它并且它可以工作,虽然我已经使用了两种不同的关系模型而不是只有一种。

即。我用

ModelA hasMany ModelBModelB belongsTo ModelA

而不是

ModelA hasMany ModelAModelA belongsTo ModelA

答案 2 :(得分:0)

当你想要获得这个页面的孩子时,就会出现猫鼬般的情况。填充你需要使用以下方式专门询问:

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

查看LoopBack的页面(http://loopback.io/doc/en/lb2/Querying-related-models.html),有类似的名为" include",您应该尝试:

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

如果有效,请告诉我!