【发布时间】:2015-06-21 14:36:41
【问题描述】:
我有以下方法,它应该找到所有传递 text="3" 的对象:
private DBCursor queryForText(final String text) {
Pattern searchPattern = Pattern.compile(text);
DBObject query = QueryBuilder.start().or(
QueryBuilder.start(MMSI_KEY).regex(searchPattern).get(),
QueryBuilder.start(IMO_KEY).regex(searchPattern).get(),
QueryBuilder.start(NAME_KEY).regex(searchPattern).get(),
QueryBuilder.start(CALLSIGN_KEY).regex(searchPattern).get(),
QueryBuilder.start(TYPEOFSHIP_KEY).regex(searchPattern).get(),
QueryBuilder.start(LENGTH_KEY).regex(searchPattern).get(),
QueryBuilder.start(WIDTH_KEY).regex(searchPattern).get())
.get();
return getVesselsCollection().find(query);
}
我的问题是,TYPEOFSHIP、LENGTH 和 WIDTH 来自 int 类型。因此,如果有人输入 text = "3",则不会找到这些属性,因为它们不是字符串。我正在寻找一种不区分值类型的方法,例如与类型转换?我不知道如何继续,也许我还不熟悉 mongoDB。
编辑: http://docs.mongodb.org/manual/reference/sql-comparison/ 你可以看到 SQL 和 MONGODB 之间的关系。我想我需要这样的东西:
SELECT *
FROM users
WHERE user_id like "%3%"
但QueryBuilder 似乎没有提供类似like 的功能。
这就是我想让它工作的 JUnit 测试:
@Test
public void testSearchForTextt() {
// Given
VesselController controller = new VesselControllerImpl();
controller.create("hugo", "bene", "2", "3", 4, 5, 6);
controller.create(" ", "bene", "2", "3", 3, 6, 7);
controller.create("3", "bene", "3", "hugo", 5, 6, 7);
controller.create("3-name", "herbert", "Toto", "hugo", 5, 6, 7);
proveAmountOfVessels(controller, 4);
proveSearch(controller, "bene", 3);
proveSearch(controller, "hugo", 3);
proveSearch(controller, "3", 5);
proveSearch(controller, "[", 0);
proveSearch(controller, " ", 1);
}
private void ueberpruefeSuche(final VesselController controller, final String text, final int expectedElements) {
// When
Collection<Vessel> treffer = controller.findByText(text);
// Then
assertEquals(String.format("Wrong amount of elements '%s' found", text), expectedElements, treffer.size());
}
相关检查是:
proveSearch(controller, "3", 5);
因为有不同类型的数据类型它不起作用。上面显示的代码的我的 MongoDB 命令应该看起来像这样:
db.vessels.find({$or : ['mmsi' : {$regex : 'text'}],
['imo' : {$regex : 'text'}],
['name' : {$regex : 'text'}],
['callsign' : {$regex : 'text'}],
...
['width' : {$regex : 'text'}]})
查询:{ $or: [ { mmsi: /3/ }, { imo: /3/ }, { name: /3/ }, { 呼号:/3/ },{ typeofship:/3/ },{ 长度:/3/ },{ 宽度:/3/ } ] }
我想这应该是正确的查询!但我不确定,因为结果不是我所期望的。
【问题讨论】:
-
文本搜索搜索字符串。如果要搜索非字符串字段,则需要添加一个带有原始字段的字符串化版本的附加字段,然后文本搜索新字段。
标签: java regex mongodb query-builder