我有以下方法,该方法应找到所有通过文字的对象=" 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",那些属性将无法找到,因为这些属性不是字符串。我正在寻找一种不通过类型来区分的方法,例如:与typecasts?我不知道如何继续,也许我还不熟悉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'}]})
查询:{$或:[{mmsi:/ 3 /},{imo:/ 3 /},{name:/ 3 /},{ 呼号:/ 3 /},{typeofship:/ 3 /},{length:/ 3 /},{width:/ 3 /} ]}
我想这应该是正确的查询!但我不确定,因为结果不是我所期望的。