这是我第一次处理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 /面向文档的数据库时,这是正常的,还是我做错了什么?
非常感谢!
答案 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 ModelB
和ModelB belongsTo ModelA
而不是
ModelA hasMany ModelA
和ModelA 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() {
//...
});
如果有效,请告诉我!