我正在對文檔的以下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結果返回:{$或:[{ 「名」:{$正則表達式:,$選項 「*約翰*。」: '-i'},「顯示名 「:{$正則表達式:」 *。*約翰 「$選項: '-i'}},{ 」名「:{$正則表達式:」 *約翰*」,$選項: '-i' },「顯示名」:{$存在:假}} ]} - 請注意,我只有一個搜索參數(在上面的例子是「約翰」) – Toonsylvania
@Toonsylvania你'displayname'是** **斯坦貝克不**約翰**!:) –
我想你誤會了我,也許我不夠清楚:)我正在尋找的是**任何**的**關鍵詞** **任一** 2個字段(名稱或顯示名稱)。如果你看看我給出的例子,其中一個預期結果是{id:5,名稱:「Doe」,displayName:「John」},它在displayName中包含john,而不是名稱。所以約翰(這裏是關鍵詞)可以在任何一列中(或者兩者都是) – Toonsylvania