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