向MongoDB结果添加额外的字段可以有效地进行

Adding extra fields to MongoDB result efficiently

本文关键字:有效地 字段 结果 MongoDB 添加      更新时间:2023-09-26

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

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

如果你想以这种方式"重塑"你的文档,你可以使用.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 运算符。

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