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

时间:2014-04-05 23:09:37

标签: javascript node.js mongodb aggregation-framework

对于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进行这种计算?

或者甚至建议将完整链接保存在数据库本身中?

1 个答案:

答案 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的参考资料。