对于API,我从MongoDB返回一个对象列表。为了更加RESTful,我想为每个对象添加一个字段link
。我的方法是在处理请求时计算它,并在一个简单的循环中添加每个对象的链接:
exports.list = function (req, res) {
collection.find({}, {fields: {a: 1, b: 1, c: 1}, function (err, docs) {
for (var i = 0; i < docs.length; i++) {
docs[i].link = 'http://api.example.com/fooobject/' + docs[i]._id;
}
res.send(docs);
});
};
然而,我觉得这样做可能不是很有效。有没有更好的方法?例如,直接告诉MongoDB进行这种计算?
或者甚至建议将完整链接保存在数据库本身中?
答案 0 :(得分:3)
如果您想以这种方式“重新塑造”文档,可以使用.aggregate()
方法而不是查找:
collection.aggregate([
{ "$project": {
"a": 1,
"b": 1,
"c": 1,
"link": { "$concat": [
"http://api.example.com/fooobject/",
"$_id"
]}
}}
],function(err,result) {
// Output work here
})
这使用$project
通过选择和创建字段来“塑造”您的文档响应。在这种情况下,可以使用$concat
将字符串与_id
字段的值相加。
要向搜索中添加查询信息,请参阅$match
运算符。
有关其他用途,请参阅aggregation framework operators的参考资料。