我正在使用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/ } ] } }
这在功能上等效于您在问题中显示的命令。