Ruby on rails 按键搜索Mongoid哈希字段
当我实现它的时候,我认为这很简单,但是经过大量搜索、谷歌搜索和扫描文档后,我似乎找不到答案 我有一个散列字段,其中键是id,值是其他id的数组。例如:Ruby on rails 按键搜索Mongoid哈希字段,ruby-on-rails,mongodb,search,mongoid,Ruby On Rails,Mongodb,Search,Mongoid,当我实现它的时候,我认为这很简单,但是经过大量搜索、谷歌搜索和扫描文档后,我似乎找不到答案 我有一个散列字段,其中键是id,值是其他id的数组。例如: {"52ab84929938c7f966d4f116"=>["52ab84919938c7f966d4ee7d"], "52ab84929938c7f966d4f117"=>["52ab84919938c7f966d4ee7d"], "52ab84929938c7f966d4f0cc"=>["52ab84919938c7f9
{"52ab84929938c7f966d4f116"=>["52ab84919938c7f966d4ee7d"],
"52ab84929938c7f966d4f117"=>["52ab84919938c7f966d4ee7d"],
"52ab84929938c7f966d4f0cc"=>["52ab84919938c7f966d4ee7d", "52ab84929938c7f966d4f13d"],
"52ab84929938c7f966d4f147"=>["52ab84919938c7f966d4ee7d"]}
这可能更适合图形类型的db,但我不熟悉这项技术,并且已经围绕Mongoid构建了我的应用程序的其余部分。这是我能为另一个复杂问题想出的最简单的解决方案
因此,我的问题是,如何搜索id为52ab84929938c7f966d4f0cc的记录
我试着像这样做,但结果为零:
Course.all_in(:skills_available => sk.id)
我知道这不起作用,但如果能起作用那就太好了:
Course.where(:skills_available.key => sk.id)
- 唯一的限制是它将跳过:
{52ab84929938c7f966d4f0cc'=>nil}
- 从技术上讲,莱泽克正确地回答了我的问题
然而,我很快意识到我需要能够在一系列密钥中找到该密钥所在的所有文档
作为参考,以下是我最后使用的解决方案:
jt = JobType.first
jt_skills = "['#{jt.skills_required.join("','")}']"
m = %Q{
function() {
found = false;
keys = Object.keys(this.skills_available);
keys.forEach(function(key) {
if(#{jt_skills}.indexOf(key) > 0) {
found = true;
}
});
if(found) {
emit(this._id, keys);
}
}
}
r = %Q{
function(key, values) { }
}
courses = Course.where(:skills_available.ne => {}).map_reduce(m,r).out(inline: true)
第二行将数组转换为可以传递到JS map函数中的字符串。JS map函数检查skills\u available散列中的每个键,看看它是否在skills\u required数组中。如果是的话,那么该文件也包括在内。最后,map\u reduce只在有可用技能的课程上运行。对于搜索人员,
.ne
是mongoid不相等的
jt = JobType.first
jt_skills = "['#{jt.skills_required.join("','")}']"
m = %Q{
function() {
found = false;
keys = Object.keys(this.skills_available);
keys.forEach(function(key) {
if(#{jt_skills}.indexOf(key) > 0) {
found = true;
}
});
if(found) {
emit(this._id, keys);
}
}
}
r = %Q{
function(key, values) { }
}
courses = Course.where(:skills_available.ne => {}).map_reduce(m,r).out(inline: true)