Node.js 结合Mongo输出和API节点
我对Node非常陌生,但我目前有一个NodeJS/Express开源CMS,我想为我正在工作的应用程序输出一些API数据。如果我没有使用正确的术语或诸如此类的东西,请原谅,这对我来说是新的 我现在有两个系列,地点和旅游。CMS允许我在两者之间建立关系。这只是将ObjectID数组存储在每个关联巡更记录的位置记录中 我想做的是获取我的API输出代码(如下),并让它输出整个tours数组,以及每个位置记录中的所有字段(标题、描述等)。目前它只输出一个ID数组 这是我目前的代码:Node.js 结合Mongo输出和API节点,node.js,mongodb,asynchronous,express,keystonejs,Node.js,Mongodb,Asynchronous,Express,Keystonejs,我对Node非常陌生,但我目前有一个NodeJS/Express开源CMS,我想为我正在工作的应用程序输出一些API数据。如果我没有使用正确的术语或诸如此类的东西,请原谅,这对我来说是新的 我现在有两个系列,地点和旅游。CMS允许我在两者之间建立关系。这只是将ObjectID数组存储在每个关联巡更记录的位置记录中 我想做的是获取我的API输出代码(如下),并让它输出整个tours数组,以及每个位置记录中的所有字段(标题、描述等)。目前它只输出一个ID数组 这是我目前的代码: var async
var async = require('async'),
landmark = require('keystone');
var Location = keystone.list('Location'),
Tour = keystone.list('Tour');
/**
* List Locations
*/
exports.list = function(req, res) {
Location.model.find(function(err, items) {
if (err) return res.apiError('database error', err);
res.apiResponse({
locations: items
});
});
}
/**
* Get Location by ID
*/
exports.get = function(req, res) {
Location.model.findById(req.params.id).exec(function(err, item) {
if (err) return res.apiError('database error', err);
if (!item) return res.apiError('not found');
res.apiResponse({
location: item
});
});
}
当前API输出(截断):
我要找的是:
{
"locations": [
{
"_id": "53a47997ebe91d8a4a26d251",
"slug": "test-location",
"lastModified": "2014-06-20T20:19:14.484Z",
"commonName": "test location",
"__v": 3,
"url": "",
"tours": [
{
"_id": "53a47963ebe91d8a4a26d250",
"title": "my test tour title",
"url": "url_to_audio_file"
}
],
"images": []
}
]
}
有人知道这是否可能吗?任何帮助都将不胜感激!谢谢 看起来您已经设置了位置
模型,以引用巡更
s,定义为巡更
s的数组。这意味着,当您将巡更
存储在位置
内时,您存储的不是表示该巡更
的数据,而是引用该巡更
的ID。当您执行find
操作时,您将在发送回客户端的响应中看到这一点
如果是这种情况,那么您可能想看看。这将获取这些引用并用它们包含的数据完全填充它们
例如,您可以将查询更改为以下内容:
Location.model.find().populate('tours').exec(function(err, items) {
// items should now contain fully populated tours
}
如果这不是你的意思,请告诉我,我可以尝试进一步提供帮助。由@dylants提供的解决方案绝对正确。但是,要使其工作,您需要在
位置
列表中将ref
选项设置为Tour
的tours
声明为类型.Relationship
字段
查看上的Keystone文档
我在下面的示例中包括了many
:true
选项,因为我假设这是一对多关系。如果不是,你可以丢弃它
var keystone = require('keystone'),
Location = keystone.list('Location');
Location.add({
...
tours: { type: Types.Relationship, ref: 'Tour', many: true },
...
});
您提到的List.relationship()
方法仅适用于希望相关文档列表自动显示在Keystone Admin UI
中,而不是建立实际关系的情况
希望这能有所帮助。感谢您的回复。我也在另一个论坛上发布了这个问题,他们也提出了同样的建议,但是它不起作用。你认为我有我的
位置
模型参考巡演
是正确的。以下是我如何在位置模型中引用Tour
:Location.relationship({path:'tours',ref:'Tour',refPath:'Location')代码><代码>填充
似乎不起作用。下面是我更新后的代码,用于尝试获取tours:Location.model.findById(req.params.id).populate({path:'tours',ref:'tours'}).exec(函数(err,item){res.apiResponse({Location:item});})代码>
var keystone = require('keystone'),
Location = keystone.list('Location');
Location.add({
...
tours: { type: Types.Relationship, ref: 'Tour', many: true },
...
});