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

Node.js Mongodb$addFields,是否从函数返回字段值?,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我正在我的mongodb集合中存储云服务视频的视频id。当我的前端为该视频调用API时,我希望根据该视频id返回格式化的URL。我有一个函数可以执行此操作,但我无法让它在和聚合管道中使用$addFields: 我的文档如下所示: { "date" : ISODate("2018-03-30T00:00:00.000+0000"), "title" : "Tips and Tricks", "video_id" : "13966740", } …我希望我的API调用

我正在我的mongodb集合中存储云服务视频的视频id。当我的前端为该视频调用API时,我希望根据该视频id返回格式化的URL。我有一个函数可以执行此操作,但我无法让它在和
聚合
管道中使用
$addFields

我的文档如下所示:

{
    "date" : ISODate("2018-03-30T00:00:00.000+0000"), 
    "title" : "Tips and Tricks", 
    "video_id" : "13966740", 
}
…我希望我的API调用返回一个额外字段,
“image\u url”

这就是我在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函数只接受字符串param并返回一个字符串

myhostingservicehelperfunctions.js

module.exports.createImageURL = function ImageURL(video_id){
    return 'https://myhostingservice.com/' + video_id + '/preview_image';
};
我的前端接收所有正确的数据,但
image\u url
的值为“
https://myhostingservice.com/$video\u id/preview\u image
”,这让我觉得我的函数运行了,但传递给它的是实际字符串
“$video\u id”
,而不是键的值,
video\u id
。仔细看,URL包含上述示例中的
“$video\u id”
,而不是
“13966740”


我做错了什么?

在mongoDB聚合中,不能像这样连接字符串,需要使用concat运算符连接字符串,因此函数“createImageURL”应该是这样的

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

你能不能也显示“createImageURL”函数?我已经在上面添加了它。该函数只返回一个基于传入字符串的连接字符串。它正在这样做,但它传递的字符串是“$video_id”,而不是我所期望的“13966740”。该函数不带参数,那么$video_id如何包含值?您不需要参数,也不需要传递video_id的值,您只需要传递键名,concat操作将自动附加该键名的值。这里唯一的要求是,在管道的那个阶段,关键名称应该是video_idWOW!我没想到这会起作用,但它真的起作用了!看起来键名$video_id仍在$concat操作的作用域中。我没有意识到这是可能的。mongodb 4.4支持:$addFields:{$function:…}
module.exports.createImageURL = function ImageURL(){
    return { $concat: [ "https://myhostingservice.com/", "$video_id", "/preview_image" ] };
};