【问题标题】:Query an array with Atlas $search使用 Atlas $search 查询数组
【发布时间】:2021-04-05 15:25:35
【问题描述】:

作为输入,我得到一个搜索查询(should 运算符)和一个过滤器(关于是否喜欢帖子,must/mustNot 运算符)。 我从以下内容开始,作为我的聚合管道的基础:

{ $search: { compound: {} } }

然后,如果给出查询,我会添加:

$search.compound.should.push({
    text: {
        query: q,
        path: ["data.displayName"],
        score: {
            boost: {
                value: 5,
            },
        },
    },
    // Plus others
});

现在,每个帖子都有一个likes 数组。我只想在likes 中选择包含特定字符串的帖子,如果可能的话,在compound.must/mustNot 下。

我想避免在计算机上加载数据并在本地过滤文档(我为整个数据库付费,我使用整个数据库!)。如果在聚合管道中无法进行数组操作,那还有什么替代方法?我仍然对文档以及应该在哪里使用运算符感到困惑。

【问题讨论】:

    标签: mongodb mongodb-query mongodb-atlas mongodb-atlas-search


    【解决方案1】:

    你离得很近。在您构建查询的方式中,您需要的是compound.filter。你也可以有 must 子句。它将排除不包含该字符串的文档。看这里

    $search.compound.must.push({
        text: {
            query: q,
            path: ["data.likes"],
        },
        // Plus others
    });
    

    【讨论】:

    • 感谢您的帮助,但我可能还不够清楚:我想我已经了解如何在搜索中添加图层,但我不知道如何检查数组是否包含一个值,以同样的方式,text 检查字符串中的文本。
    • 查看我的编辑。感谢您的澄清@a2br
    • 代码指示路径是否存在,而不是数组是否包含值...或者我在这里遗漏了什么?
    • 第一个查询是数组是否包含字符串值。但我认为这是语义问题,因为您的某些评论并未完全使用预期意义上的术语。所以,我想也许你的意思是数组,单值数组就是你的路径。
    • 我想我需要进一步澄清。
    猜你喜欢
    • 2022-10-18
    • 2021-06-01
    • 2022-12-05
    • 2022-06-14
    • 1970-01-01
    • 2011-08-29
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多