Mongodb $ addFields,是否从函数返回字段值?

时间:2019-01-16 21:03:20

标签: node.js mongodb aggregation-framework

我正在mongodb集合中存储在云中投放的视频的视频ID。当我的前端对该视频进行API调用时,我想基于该视频ID返回格式化的URL。我有一个函数可以执行此操作,但是我无法使其与$addFields管道中的aggregate一起使用:

我的文档如下:

{
    "date" : ISODate("2018-03-30T00:00:00.000+0000"), 
    "title" : "Tips and Tricks", 
    "video_id" : "13966740", 
}

...并且我希望我的API调用返回一个额外的字段"image_url"

{
    "date" : ISODate("2018-03-30T00:00:00.000+0000"), 
    "title" : "Tips and Tricks", 
    "video_id" : "13966740", 
    "image_url" : "https://myhostingservice.com/13966740/preview_image", 
}

这是我在models / video.js中尝试的方法:

const hostingservice = require('myhostingservicehelperfunctions');

module.exports.getVideo = function (callback) {
    videoCollection.aggregate(
        [
            { $match: { } },
            { $addFields: {
                    image_url: hostingservice.createImageURL("$video_id")
                }
            },
            { $sort: {
                'date' : -1 }
            }
        ],
        callback);
};

helper函数只需获取字符串参数并返回一个字符串。

myhostingservicehelperfunctions.js

module.exports.createImageURL = function ImageURL(video_id){
    return 'https://myhostingservice.com/' + video_id + '/preview_image';
};

我的前端接收到所有正确的数据,但是image_url的值是“ https://myhostingservice.com/$video_id/preview_image”,这让我认为我的函数已运行,但已传递了实际的字符串"$video_id" ,而不是键video_id的值。仔细观察,该URL包含"$video_id",而不是上面示例中的"13966740"

我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

您无法在mongoDB聚合中连接字符串,您需要使用concat运算符连接字符串,因此函数“ createImageURL”应如下所示

module.exports.createImageURL = function ImageURL(){
    return { $concat: [ "https://myhostingservice.com/", "$video_id", "/preview_image" ] };
};