2016-12-01 84 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/})