MongoDB Java 客户端使用 $regex 和 $in

MongoDB Java client using $regex with $in

我正在使用MongoDBJava客户端查询数据:

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.5.0</version>
    </dependency>

服务器版本为3.4.10。

当使用 MongoDB shell 时,我可以成功查询使用:

db.c1.find(
    { title: { $in: [/test/,/demo/] } },
    { title:1 }
)

但是当使用 Java 驱动程序时它不起作用。例如:

List<String> keywords = new ArrayList<>();
keywords.add("/test/");
keywords.add("/demo/");
Document titleRegEx = new Document("$in", keywords);

Document filter = new Document("title", titleRegEx);

Document firstDoc = coll.find(filter).first();

logger.info("firstDoc: {}", firstDoc);

请帮帮我。

如果您对 MongoDB 调用进行概要分析,您将看到此 'find statement' ...

List<String> keywords = new ArrayList<>();
keywords.add("/test/");
keywords.add("/demo/");
Document titleRegEx = new Document("$in", keywords);

Document filter = new Document("title", titleRegEx);

Document firstDoc = coll.find(filter).first();

... 导致将以下过滤器提交给 MongoDB:

filter: { title: { $in: [ "/test/", "/demo/" ] } } }

记下$in文档的值;而不是 $in: [/test/,/demo/],它是:$in: [ "/test/", "/demo/" ]。因此,它对“/test/”和“/demo/”执行精确的字符串匹配,而不是正则表达式匹配。这就解释了为什么这个 'find statement' returns 什么都没有。

您在使用 Java 驱动程序时进行正则表达式搜索,如下所示:

Filters.regex("title", "test")

MongoDB Java 驱动程序不允许您为 $in 提供 Bson 个实例的集合,因此如果您想搜索与以下之一匹配的文档此 'in' 列表中的元素:/test/, /demo/ 然后您必须形成一个 OR 查询。例如:

 Bson filter = Filters.or(Filters.regex("title", "test"), Filters.regex("title", "demo"));

 FindIterable<Document> documents = collection.find(filter);

如果分析 MongoDB 调用,您会看到上面的代码导致以下 'find statement' 在 MongoDB 上执行:

find { find: "posts", filter: { $or: [ { title: /test/ }, { title: /demo/ } ] } }

在功能上等同于您在问题中显示的命令。