【问题标题】:MongoDB: find documents that contain a certain value in one of its fieldsMongoDB:在其中一个字段中查找包含特定值的文档
【发布时间】:2017-06-26 20:00:10
【问题描述】:

对不起标题...

我有一个这样的 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 的文档。

如果不逐个字段(学生、教师、主管)显式查询,这是否可行?

谢谢 ;)

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

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

    必须指定所有字段,但您可以使用 $or 条件执行此操作:

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

    当然,您可以寻找方法来确定您需要以这种方式包含的“字段”,否则就会遭受您可以使用 mapReduce 进行的那种 JavaScript 扫描。

    【讨论】:

    • 感谢您的回答。这是我可以忍受的事情,与其说是一场灾难,不如说是一种好奇心。干杯
    【解决方案2】:

    查看有关 TextIndex 的文档。如果您创建一个 TextIndex,您可以搜索多个属性。但是在创建索引时,您需要包含所有需要搜索的属性。您还可以为每个属性提供权重,以便 Mongo 可以根据与值匹配的属性对结果进行排序。

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

    【讨论】:

    • 我明白你这么说是因为它似乎是想要搜索多个字段,而且这个问题有些抽象。但是您不能在多个数组或“多键”类型字段上拥有“文本索引”或任何类型的索引。
    猜你喜欢
    • 2016-06-18
    • 2023-03-21
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多