2014-03-29 84 views
0

很抱歉的标题的一个特定值的文件...MongoDB的:找到包含在其领域

我有一个MongoDB的集合是这样的:

{ 
students: [1, 2, 3], 
teachers: [4, 5] 
}, 
{ 
students: [5, 6, 7, 8, 9], 
teachers: [10] 
}, 
{ 
students: [11, 12, 14, 15, 16], 
teachers: [17, 18] 
supervisor: [5] 
} 

比方说,“1” “2”,“...”表示是老师,学生还是别的什么人。我想要做的是找到包含主题5的文档。

这可能没有明确地按字段(学生,教师,主管)查询字段?

感谢;)

回答

1

使用数组时,您受多键索引的约束约束。所以你不可能创建一个有多个“数组”类型元素的compound index。这样就排除了可以在搜索中跨越多个字段的方法。如文字搜索。

必须指定所有领域,但你可以做到这一点与$或条件:

db.collection.find({ 
    "$or": [ 
     { "students": 5}, 
     { "teachers": 5 }, 
     { "supervisor": 5 } 
    ] 
}) 

当然你看的方式来确定你所需要的“田”以这种方式包含,否则就会遭受你可以用mapReduce做的JavaScript扫描。

+0

感谢您的回答。这是我可以生活的东西,更多的是好奇而不是灾难。干杯 – jlazevedo

1

检查TextIndex的文档。如果您创建了TextIndex,则可以搜索多个属性。但是,在创建索引时,您需要包含所有需要搜索的属性。您还可以为每个属性提供权重,以便Mongo可以对结果进行排序取决于哪个属性与该值匹配。

编辑 - 根据Neil的评论排除文本编辑。你能尝试在每个属性上创建单个索引,然后对所有属性使用OR子句吗? OR会利用所有单个索引。性能将取决于属性的数量。

+1

我明白你这么说过,因为它似乎是想要在多个领域进行搜索,而且问题有点抽象。但是你不能有一个“文本索引”或任何类型的索引在多个数组或“多键”类型的字段。 –

+0

我同意,我将编辑我的帖子。 – hellboy