向MongoDB高效地添加额外的字段

对于一个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做这样的计算?

还是甚至build议将完整的链接保存在数据库本身?

如果您想以这种方式“重新塑造”文档,则可以使用.aggregate()方法而不是find:

 collection.aggregate([ { "$project": { "a": 1, "b": 1, "c": 1, "link": { "$concat": [ "http://api.example.com/fooobject/", "$_id" ]} }} ],function(err,result) { // Output work here }) 

这使用$project来通过select和创build字段来“塑造”你的文档响应。 在这种情况下,使用$concat来将string与_id字段的值连接起来。

要将查询信息添加到search中,请参阅$match运算符。

有关其他用途,请参阅聚合框架运算符的参考。