如何获取文档,其中任何字段值与MongoDB Java中列出的任何表达式匹配

时间:2017-11-20 14:24:55

标签: java regex mongodb

我正在尝试获取集合中的所有文档,其中任何文档字段都可以匹配任何列出的正则表达式。

考虑以下情况。

用户可以在集合中创建具有不同字段名称的文档。

,例如

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());

我可以看到键值正常,但它没有获取匹配的文档。

我是MongoDB的新手,我在谷歌搜索后遵循了上述方法。

1 个答案:

答案 0 :(得分:0)

如果您希望在字段名称(而不是值)上进行正则表达式匹配,请使用$objectToArray将字段名称(LHS)转换为表达式值(RHS):

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 } }