我正在使用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改为变量
答案 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") + ".*"));