如何获取文档,其中任何字段值都与MongoDB Java中列出的任何表达式匹配
我正在尝试获取集合中的所有文档,其中任何文档字段都可以与列出的任何正则表达式匹配 考虑以下情况 用户可以在集合中创建具有不同字段名称的文档 比如如何获取文档,其中任何字段值都与MongoDB Java中列出的任何表达式匹配,java,regex,mongodb,Java,Regex,Mongodb,我正在尝试获取集合中的所有文档,其中任何文档字段都可以与列出的任何正则表达式匹配 考虑以下情况 用户可以在集合中创建具有不同字段名称的文档 比如 document1 = >{ "_id":1, "card" : 1234 , "status": 4} document2 => {"_id": ***, "Housenumber" : 356/78 , "value" : null} ------ documentn =>{ "_id" : ObjectId("4ecd2e33d
document1 = >{ "_id":1, "card" : 1234 , "status": 4}
document2 => {"_id": ***, "Housenumber" : 356/78 , "value" : null}
------
documentn =>{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
------
集合中所有文档的字段名都不相同
正则表达式可以是:“/^(^456$| ^win$…..等)/”
我尝试动态获取密钥并按如下所述查找查询:
----------
table = db.getCollection(coll);
DBObject dataKeys = table.findOne();
Set<String> keys = dataKeys.keySet();
Iterator<String> iterator = keys.iterator();
while(iterator.hasNext()){
String key = iterator.next();
regexQuery.put(**key**, new BasicDBObject("$regex", "^((^(([0-9]{4}[-. _]?)$)|"
+ "(^[a-zA-Z0-9._%+-]...........................0-9]$$").append("$options", "i"));
DBCursor cursor = table.find(regexQuery);
while (cursor.hasNext()) {
System.out.println(cursor.next());
----------
table=db.getCollection(coll);
DBObject dataKeys=table.findOne();
Set keys=dataKeys.keySet();
迭代器迭代器=keys.Iterator();
while(iterator.hasNext()){
String key=iterator.next();
regexQuery.put(**键**,新的BasicDBObject($regex)”,“^(^(([0-9]{4}[-.\u]?)$)|”
+“(^[a-zA-Z0-9.uz%+-]……………..0-9]$$”。附加(“$选项”,“i”);
DBCursor=table.find(regexQuery);
while(cursor.hasNext()){
System.out.println(cursor.next());
我可以看到键值是正确的,但它没有获取匹配的文档
我是MongoDB的新手,在谷歌搜索之后,我遵循了上述方法。如果您希望在字段名(而不是值)上进行正则表达式匹配,那么使用
$objectToArray
将字段名(LHS)转换为表达式值(RHS):
如果要在字段名(而不是值)上进行正则表达式匹配,请使用
$objectToArray
将字段名(LHS)转换为表达式值(RHS):
您好,Moschetti,感谢您的及时回复,我正在查找字段值上的正则表达式匹配项,而不是名称上的正则表达式。基本上,我需要列出所有具有与列表中任何正则表达式匹配的值的文档,而不管它们存在于哪个字段中。将x.k上的$match更改为x.v,您就有了解决方案。:-)您好,Moschetti,我正试图在Mongo Java.AggregateItableOutput=collection.aggregate(Arrays.asList(新文档($project),新文档($x),新文档($objectToArray,“$$CURRENT”)),新文档($unwind“,“$x”),新文档($match),新文档($x.k),新文档($in),新基本文档($regex)”,“^(ISBN(-10)?:?)?([-0-9xX]{13}|[0-9X]{10})$”))());但这不起作用。您好,Moschetti,谢谢您的及时回复,我正在查找字段值而不是名称上的正则表达式匹配。基本上,我需要列出所有具有与列表中任何正则表达式匹配的值的文档,而不管它们存在于哪个字段中。将x.k上的$match更改为x.v,您就有了解决方案我想在Mongo Java.AggregateIterable output=collection.aggregate(Arrays.asList(新文档($project),新文档($x),新文档($objectToArray,“$$CURRENT”)),新文档($unwind,“$x”),新文档($match),新文档($x.k),新文档($in),新BasicDBObject($regex),“^(ISBN(-10)?:?)?([-0-9xX]{13}|[0-9X]{10}$”))))))”));但这不起作用。
var r = [
{ _id: 1, name: "buzz", addr: "here"}
,{ _id: 2, searchword: "win", value: 6}
,{ _id: 3, game:0, word: "foo", fruit: "apple", fame: 7}
,{ _id: 4, qval:23}
];
db.foo.insert(r);
var rin = [ /ame/, /^val/ ]; // list of regex
db.foo.aggregate([
{$project: {x: {$objectToArray: "$$CURRENT"}}}
,{$unwind: "$x"}
,{$match: {"x.k": {$in: rin}}}
]);
{ "_id" : 1, "x" : { "k" : "name", "v" : "buzz" } }
{ "_id" : 2, "x" : { "k" : "value", "v" : 6 } }
{ "_id" : 3, "x" : { "k" : "game", "v" : 0 } }
{ "_id" : 3, "x" : { "k" : "fame", "v" : 7 } }