【问题标题】:Query which finds all Objects which contains text查找所有包含文本的对象的查询
【发布时间】: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);
}

我的问题是,TYPEOFSHIPLENGTHWIDTH 来自 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


【解决方案1】:

【讨论】:

  • 看来方向是对的,反正我有问题。我正在使用 QueryBuilder 来创建查询,但没有用于“文本”搜索的方法,Java 提供了“正则表达式”方法,它似乎与“文本”搜索几乎相似,但我不知道它是否相同。也许有人知道在哪里可以找到很好的 QueryBuilder 描述,因为我无法获得任何 API。
猜你喜欢
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2021-06-11
  • 2019-06-13
相关资源
最近更新 更多