2011-11-23 91 views
16

在這種情況下使用Pymongo。Mongodb - 如何在多個字段中查找字符串?

我有用戶有電子郵件,名字,姓氏。

我用這Pymongo片段:

user_found = users.find({'$or':[ 
      {'email':{'$regex':searchString, '$options':'i'}}, 
      {'first_name':{'$regex':searchString, '$options':'i'}}, 
      {'last_name':{'$regex':searchString, '$options':'i'}}]}) 

這個例子中的作品,如果我想找到搜索字符串中:

  • 電子郵件,或
  • FIRST_NAME,或
  • 姓氏

現在我需要還可以在first_name + last_name中查找searchString組合。

我該怎麼辦呢? 是否有蒙戈的方式,通過查詢,將二者結合起來成爲一個「全名」,然後搜索全名?

回答

13

最簡單的方法是增加一個陣列場,並填充它與所有你想要搜索的變種。索引該數組字段。

這樣,您只需要一個索引,並且跨所有字段的搜索都很簡單,而且當您想搜索某個新的搜索變體時不會更改。您也可以歸你把搜索陣列,例如文本,下殼體它,去除標點符號等

https://stackoverflow.com/q/8206188/224370

編輯: MongoDB的文檔現已覆蓋keyword searchfull-text search的新功能。

+1

非常簡潔的答案。什麼親。 –

+0

@lan Mercer我的搜索工作適合多個領域,我只需要執行搜索組合的[fname + sname]字段,我是否需要爲這兩個字段創建索引以完成它?請簡要說明一下,任何示例? –

+0

@AqibMumtaz請發表一個新的問題,舉例說明你正在做什麼 - 評論不是提出新問題的最佳地點。 –

0

我有同樣的問題。我已經使用正則表達式字符串搜索,所以我的解決方案是:

生成一個幫手集合。在這裏,我將所有相關的字符串,如:

{ 
    search_field: email + " " + first_name + " " + last_name, 
    ref_id: (id to real object) 
} 

然後我用一個正則表達式來創造什麼,我允許尋找:

// logic found here: http://stackoverflow.com/questions/10870372/regex-match-if-string-contain-all-the-words-or-a-condition 
var words = query.split(/[ ,]+/); 
var regstr = ""; 
for (var i = 0; i < words.length; ++i) { 
    var word = words[i]; 
    regstr += "(?=.*?\\b" + word + ")"; 
} 
regstr += "^.*$"; 
regex = new RegExp(regstr, "i"); 

然後,這也給有關訂單有一定的靈活性。

搜索並不是最快的,因爲它仍然在所有元素上使用正則表達式,但它對我來說沒問題。 (我也指數search_field集合

獲得的結果也成爲一個嵌套調用,因爲首先你需要得到你真正想要的_ids,然後你就可以像這樣詢問他們:

connection.find({ "search_field" : regex }, { _id: 0, ref_id: 1 }, { limit: limit, skip: start }).toArray(function (err, docs) { 
    if (err) throw err; 
    // map array of documents into simple array of ids 
    var ids = []; 
    for (var i = 0; i < docs.length; ++i) 
    { 
     var doc = docs[i]; 
     ids.push(doc.ref_id); 
    } 
    if (ids.length > 0) 
     MongooseEmails.find({ "_id": { $in: ids } }, function (err, docres) { 
      if (err) throw err; 
      res.send(JSON.stringify(docsres)); 
     }); 
    else 
     res.send(""); 
}); 

這是編輯代碼..也許有語法錯誤,一般來說,它是爲我工作。

相關問題