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



我正在使用MongoDB Java客户端来查询数据:

    <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语句"...

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 语句"不返回任何内容。

使用 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调用,你会看到上面的代码导致在MongoDB上执行以下"find语句":

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

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

最新更新