查找包含文本的所有对象的查询

时间:2015-04-15 14:51:40

标签: java regex mongodb query-builder

我有以下方法,该方法应找到所有通过文字的对象=" 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 /}   ]}

我想这应该是正确的查询!但我不确定,因为结果不是我所期望的。

1 个答案:

答案 0 :(得分:0)