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;
}