如何使用MongoDB Java 3查询“包含”?

时间:2017-05-24 20:24:19

标签: java regex mongodb

我正在使用Java驱动程序3来处理MongoDB。 我在一个集合中有以下文件。

  {
    "_id" : ObjectId("59231945aefa1a301db180a1"),
    "username" : "off",
    "trx_type" : "pair",
    "amount" : 100000,
    "note" : "testpair 2:2"
  },
  {
    "_id" : ObjectId("591d7a0b03c09b5142fb5602"),
    "amount" : 100000,
    "trx_type" : "pair",
    "note" : "2:2",
    "username" : "ok"
  }

我想查询这两条记录。

如果我使用它,从命令行:db.transactions.find(“note”:/ 2:2 /) 包括以下文件。

{
    "_id" : ObjectId("5925e6a8aefa1a339a8c013f"),
    "username" : "oktrade001",
    "trx_type" : "pairing bonus",
    "time" : NumberLong("1495656104204"),
    "amount" : 100000,
    "note" : "22:22"
}

尝试了几件事:

这只返回确切的“2:2”,不包含: Document transaction = transactions.find(eq("note", s + ":" + s)).first();

这不起作用: String note = "/" + s + ":" + s + "/"; Document transaction = transactions.find(eq("note", note)).first();

阅读$regex,找不到使用它来进行Mongo Java 3的示例查询。

请帮助......谢谢你。

更新: 所以...这是我需要在Java驱动程序中执行的mongo命令: db.transactions.find({"note": {"$regex": /2:2$/}}).pretty() 在mongo命令行中尝试了这个,得到了我想要的东西。如何在Java驱动程序3+中编写这个? 还......我需要将数字2改为变量

3 个答案:

答案 0 :(得分:1)

所以这就是做了:

Document transaction = transactions.find(and(regex("note", ".* " + s + ":" + s + " .*"), eq("username", username))).first();

刚刚添加了用户名验证条件

答案 1 :(得分:1)

您需要考虑到默认情况下锚定正则表达式模式,因此需要整个字符串匹配

知道这一点,你可以轻松控制比赛的位置:

  • 字符串开头:

    transactions.find(regex("note", Pattern.quote(s) + ".*"));

  • 字符串结尾:

    transactions.find(regex("note", ".*" + Pattern.quote(s)));

  • 字符串中的任何位置:

    transactions.find(regex("note", ".*" + Pattern.quote(s) + ".*"));

一个注意事项:如果您需要在包含换行符的字符串中找到匹配项,则需要一个DOTALL修饰符(其内联版本为(?s)),或者像这样: transactions.find(regex("note", "(?s).*" + Pattern.quote(s) + ".*"));。请参阅regex method docs。受支持的修饰符列表(在MongoDB中称为 options )可以是checked here

答案 2 :(得分:0)

我相信,使用正则表达式的正确方法:

transactions.find(regex("note", "^2:2.*"));

如果它可能包含特殊符号,请不要忘记转义表达式:

transactions.find(regex("note", "^" + Pattern.quote("my * expression") + ".*"));