2016-11-24 53 views
0

我正在對文檔的以下2列執行搜索:名稱displayName。但是,只有幾條記錄有displayName列。當一條記錄同時存在時,我想要搜索兩個字段(name和displayName)以獲得可能的匹配。否則,如果記錄沒有列displayName,我只想搜索名稱來代替。所以我想我會做一個。然而,這隻會搜索有兩列的字段 - 儘管我想搜索所有記錄。如何搜索兩列(其中一列僅出現在幾條記錄中)?

如何更新查詢以達到上述目的?下面是我的嘗試:

function search(search) { 
    return this.find({ $or: [ 
     {"displayName" : {"$regex" : ".*"+ search +".*", "$options": "-i"}}, 
     {"name" : {"$regex" : ".*"+ search +".*", "$options": "-i"}} 
    ]}).exec(); 
} 

所以在上面的查詢中,邏輯告訴我,如果顯示名列不存在,則首先檢查將返回所以它就會搜索這將基於匹配返回真/假。我明顯錯過了一些東西,因爲即使第二次檢查是真的,總體結果也是錯誤的(這更像是AND行爲,而不是OR)。

數據舉例:

{ id: 3, name: "John Steinbeck", displayName: "Steinbeck" } 
{ id: 4, name: "John Lennon" } 
{ id: 5, name: "Doe", displayName: "John" } 
{ id: 5, name: "Harry Potter", displayName: "Harry" } 

搜索詞:

john 

預期結果:

{ id: 3, name: "John Steinbeck", displayName: "Steinbeck" } 
{ id: 4, name: "John Lennon" } 
{ id: 5, name: "Doe", displayName: "John" } 

後來編輯

這個查詢似乎確實起作用,問題原來是數據而不是查詢。人爲錯誤。我道歉:)

回答

0

您對不同的條件:

  • 領域都存在,並且具有正確的價值
  • 只有名稱存在,並且具有正確的價值

使用$exist$or

例如:

db.col.find({ $or: [ { name: {$regex : ".*John.*"}}, displayName: {$regex : ".*Steinbeck.*"}}, { name: "john", { displayName: { $exists: false } } } ] }) 
+0

感謝您的答覆。我明白我的邏輯中存在缺陷。我已經適應了你的答案,我的例子,但現在我得到0結果返回:{$或:[{ 「名」:{$正則表達式:,$選項 「*約翰*。」: '-i'},「顯示名 「:{$正則表達式:」 *。*約翰 「$選項: '-i'}},{ 」名「:{$正則表達式:」 *約翰*」,$選項: '-i' },「顯示名」:{$存在:假}} ]} - 請注意,我只有一個搜索參數(在上面的例子是「約翰」) – Toonsylvania

+0

@Toonsylvania你'displayname'是** **斯坦貝克不**約翰**!:) –

+0

我想你誤會了我,也許我不夠清楚:)我正在尋找的是**任何**的**關鍵詞** **任一** 2個字段(名稱或顯示名稱)。如果你看看我給出的例子,其中一個預期結果是{id:5,名稱:「Doe」,displayName:「John」},它在displayName中包含john,而不是名稱。所以約翰(這裏是關鍵詞)可以在任何一列中(或者兩者都是) – Toonsylvania

0

改變您的查詢:

db.getCollection('user').find({ $or: [ 
    {"name" : {$regex: "john", $options: "$i"}}, 
    {"displayName" : {$regex: "john", $options: "$i"}}]}) 
相關問題