2016-12-01 82 views
0

这是我的MongoDB查找查询:MongoDB的发现操作查询给出错误的结果

db.getCollection('candidate').find({ 
    "$or": [ 
     { 
     "email_id": { 
      "$regex": { 
      "regex": "^ranjit", 
      "flags": "i" 
      } 
     } 
     }, 
     { 
     "mobile_no": { 
      "$regex": { 
      "regex": "^ranjit", 
      "flags": "i" 
      } 
     } 
     }, 
     { 
     "phone_no": { 
      "$regex": { 
      "regex": "^ranjit", 
      "flags": "i" 
      } 
     } 
     }, 
     { 
     "skill_name": { 
      "$regex": { 
      "regex": "^ranjit", 
      "flags": "i" 
      } 
     } 
     }, 
     { 
     "current_address": { 
      "$regex": { 
      "regex": "^ranjit", 
      "flags": "i" 
      } 
     } 
     }, 
     { 
     "first_name": { 
      "$regex": { 
      "regex": "^ranjit", 
      "flags": "i" 
      } 
     } 
     } 
    ] 
    } 
) 

以上蒙戈DB查询返回我是错的元组。它返回不包含“ranjit”的元组,但实际上我想要包含“ranjit”的元组。

你能解释为什么它返回错误的元组,什么是正确的查询?

+0

为什么不使用通配符的文本索引? – styvane

+0

什么是mongodb版本? – 4J41

+0

mongo DB - 2.4.14 – user3235105

回答

1

你可以试试这个

//like '%ranjit%' 
    db.getCollection('candidate').find($OR:[...{""email_id": /ranjit/},....]) 

    //like 'ranjit%' 
    db.getCollection('candidate').find($OR:[...{""email_id": /^ranjit/},....]) 

    //like '%ranjit' 
    db.getCollection('candidate').find($OR:[...{""email_id": /ranjit$/},....]) 

使用正则表达式:

db.getCollection('candidate').find($OR[... {"email_id" : {$regex : ".*ranjit.*"}},...]); 
+0

但我想用$或条件在多个字段中搜索。 – user3235105

+0

但我想在php中生成上面的查询,并传递给mongo db来运行 – user3235105

+1

您可以保持相同的只有匹配条件将改变“email_id”:{ “$ regex”:{ “regex”:“^ ranjit”, “flags”:“i” } } – AJS

0

如果你需要搜索同一个查询多个字段,你可以在文档,其中包含连接值在添加新字段的所有字段,然后在该字段上进行正则表达式搜索。 因此,与字段的名称“,“电子邮件”的文件,“skillName”将改变为:

{ 
    name: 'Ranjit', 
    email: '[email protected]', 
    skillName: 'MongoDB Administration', 
    gist: 'Ranjit|[email protected]|MongoDB Administration' 
} 

您可以轻松地进行现场gist正则表达式基于搜索。如果您在多个字段上执行查询,则需要一个复合索引来加速搜索,但在这种情况下,只需要一个索引(对于gist)。

这里是你将需要火的搜索操作查询:

db.getCollection('candidate').find({"gist": /ranjit/})