Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何调用存储的JavaScript函数向使用linq和c驱动程序的查询返回的对象添加字段_Mongodb_Mongodb .net Driver_Stored Functions - Fatal编程技术网

Mongodb 如何调用存储的JavaScript函数向使用linq和c驱动程序的查询返回的对象添加字段

Mongodb 如何调用存储的JavaScript函数向使用linq和c驱动程序的查询返回的对象添加字段,mongodb,mongodb-.net-driver,stored-functions,Mongodb,Mongodb .net Driver,Stored Functions,我有一个疑问: var professionalProfilesQuery = (from profileCollection in _mongoContext.Database.GetCollection<Profile>("profiles").AsQueryable() join userCollection in _mongoContext.Database.GetCollection<User>("users").AsQueryable()

我有一个疑问:

var professionalProfilesQuery = 
    (from profileCollection in _mongoContext.Database.GetCollection<Profile>("profiles").AsQueryable()
     join userCollection in _mongoContext.Database.GetCollection<User>("users").AsQueryable()
     on profileCollection.UserId equals userCollection.Id.Value
     into users
     orderby profileCollection.Name
     select new ProfessionalProfile
     {
         Id = profileCollection.Id,
         Name = profileCollection.Name,                                                 
         UserId = profileCollection.UserId,
         IsConfirmed = users.First().IsConfirmed,                                                 
     })
     .Where(p => p.IsConfirmed);
是否可以将字段添加到查询返回的数据中,并使用计算出的分数?我如何调用存储的javascript函数来执行此操作?我想做一些类似的事情:

function candidateScore(objectWithDataToCalculateScore, professionalProfile) {

    var score = 0;
    //Calculate score here
    return score;
}
var professionalProfilesQuery = 
    (from profileCollection in _mongoContext.Database.GetCollection<Profile>("profiles").AsQueryable()
     join userCollection in _mongoContext.Database.GetCollection<User>("users").AsQueryable()
     on profileCollection.UserId equals userCollection.Id.Value
     into users
     orderby profileCollection.Name
     select new ProfessionalProfile
     {
         Id = profileCollection.Id,
         Name = profileCollection.Name,                                                 
         UserId = profileCollection.UserId,
         IsConfirmed = users.First().IsConfirmed,   
         Score = ***CallToCandidateScoreFunctionHere...***                                     
     })
     .Where(p => p.IsConfirmed);
这是javascript函数的另一部分,其中有些计算非常复杂,所以我对它进行了简化。我希望这足以说明我需要什么:

function candidateScore(professionalProfileRequirements, professionalProfile) {                         
    var score = 0;

    if (professionalProfileRequirements.Province === professionalProfile.Province)  {
        score += 1000;
    }

    if (professionalProfileRequirements.Role && professionalProfile.Roles && professionalProfile.ExperienceLevel){
        if (professionalProfile.Roles.includes(professionalProfileRequirements.Role)) {
            switch (professionalProfile.ExperienceLevel) {
                case 'ExperienceLevel_NoExperience':
                    score += 1;
                    break;
                case 'ExperienceLevel_LessThanOneYear':
                    score += 2;
                    break;
                case 'ExperienceLevel_BetweenOneAndThreeYears':
                    score += 4;
                    break;
                case 'ExperienceLevel_BetweenThreeAndFiveYears':
                    score += 6;
                    break;
                case 'ExperienceLevel_MoreThan5Years':
                    score += 10;
                    break;
            }
        }
    }

    return score;
}

我不知道如何使用聚合进行这种计算。任何帮助或任何其他方法,我可以遵循将不胜感激

你不想那样做。JavaScript执行的eval方法对于所有驱动程序都是不推荐的,并将很快从MongoDB服务器API中删除。读读那本书。您认为您在服务器JavaScript执行中所做的一切都是在客户机上以您选择的实现语言执行的。简而言之,您希望直接在select中进行计算。如果LINQ不支持所需的表达式,则始终可以直接从驱动程序使用BsonDocument构造和聚合方法。但计算是你问题中遗漏的一件事。所以,也许你应该包括这到底是什么。嗨@NeilLunn。我补充了关于计算的更多细节。不确定我是否正确解释了我需要什么。我知道这很复杂,也不确定我是否走上了正确的道路。对于这里的许多人来说,开关/案例并不是一个需要理解的问题。更重要的是解释细节,例如professionalProfile需求、函数的professionalProfile参数以及它们在当前数据中的实际来源。如果您指出查询中使用的类中的哪些属性实际表示这些属性,那么这里的人可能会提供帮助。当你想在这里获得帮助时,你需要给人们尽可能多的细节。对于直接的指导点,与swich/case没有直接的关联,而swich/case转换为司机支持的LINQ。然而,如果?然后:允许使用else表达式。
function candidateScore(professionalProfileRequirements, professionalProfile) {                         
    var score = 0;

    if (professionalProfileRequirements.Province === professionalProfile.Province)  {
        score += 1000;
    }

    if (professionalProfileRequirements.Role && professionalProfile.Roles && professionalProfile.ExperienceLevel){
        if (professionalProfile.Roles.includes(professionalProfileRequirements.Role)) {
            switch (professionalProfile.ExperienceLevel) {
                case 'ExperienceLevel_NoExperience':
                    score += 1;
                    break;
                case 'ExperienceLevel_LessThanOneYear':
                    score += 2;
                    break;
                case 'ExperienceLevel_BetweenOneAndThreeYears':
                    score += 4;
                    break;
                case 'ExperienceLevel_BetweenThreeAndFiveYears':
                    score += 6;
                    break;
                case 'ExperienceLevel_MoreThan5Years':
                    score += 10;
                    break;
            }
        }
    }

    return score;
}