2016-03-01 63 views
0

在我的收藏中,我得到了兩個字段gendercountryMongoDB查詢查找多個字段或文檔

gender字段中,它們都是「女性」,並且它們每個都在不同的country

我試圖查詢集合:

return Meteor.users.find(
    { 
     _id: {$ne: Meteor.userId()}, 
     $or: [ { "country": "Australia" }, { "gender": "" } ] 
    }).fetch(); 

結果是這樣的:

當設置gender爲「空」或清空它給了我是誰在澳大利亞的所有用戶。

但是,當我設置gender爲「女」和country爲「澳大利亞」它給了我所有的女性用戶從被認爲是澳大利亞唯一female不同的國家。它似乎忽略了country的第一個參數。

有沒有辦法讓它更準確?請幫助謝謝你。

我的目標是:

爲了更準確地進行數據庫查詢和BW能夠通過這種變化。

例子:

回過頭來看看這個問題上面,當我添加了「性別」的搜索查詢時,它應該只找女性用戶他的國家是澳大利亞。並非所有來自不同國家的女性。

+0

您可以通過編輯它來包含一些樣本文件和預期的輸出,因爲目前很難遵循,請您澄清一下您的問題?如果所有文件的「性別」字段都是「女性」字段,但具有不同的「國家/地區」值,那麼爲什麼不能在「國家/地區」字段上查詢? – chridam

回答

0

我終於找到了解決這個問題的方法。這是一個很長的代碼,但它的確有竅門。

  1. 我掃描我並取出空數據,在我的情況下,如果以上性別==爲「」那麼,如果存在忽略其他人獲取其數據的數據。我通過循環做到了。

  2. 使用數組推送我能夠插入對象。例如:如果國家不爲空,那麼:

    變量 .push('{「+ objectPropertyName [i] +''+':'+'」'+ objectValue [i] +'「}');

這樣做的輸出如下所示:

["{"country":"Australia"}", "{"gender":"female"}"] 

通過將其解析爲JSON然後成爲一個對象。

一旦所有所需查詢的對象設置的,我可以通過查詢蒙戈:

db.collection.find({"_id": {$ne: Meteor.userId()}, $and: **variable**}).fetch(); 

到目前爲止,它完美的作品。 :)

3

由於需要滿足兩個條件的女性,以及國家,它應該是和

return Meteor.users.find({ _id: {$ne: Meteor.userId()}, 
          $and: [{"country": "Australia"}, 
            {"gender": "female"}] 
         }).fetch(); 
+0

一個很好的建議,我試過了,但是當設置性別或國家爲空或沒有值時,它不會顯示任何結果。 我正在創建一個過濾器搜索功能,有時某些字段可能爲空或沒有值,這就是爲什麼我決定使用「OR」,因此它可以忽略空值並僅執行帶有值的值。 –

+0

@WebsiteIsFun如果你真的「總是」想要「女性」的性別,那麼它**是一個「AND」條件。這裏唯一重新調整的是「所有」MongoDB查詢條件已經是「AND」條件,所以'{「_id」:{「$ ne」:Meteor.userId(),「country」:「Australia」,「gender」 :「女性」}'或者如果你真的不具體說明國家的價值,那就在那裏使用'$或':'{「_id」:{「$ ne」:Meteor.userId(),「gender」:「female 「,」$ or「:[{」country「:{」$ in「:[」Australia「,null]},{」country「:{」$ exists「:false}}]}'然而,數據被存儲。 –

+0

@WebsiteIsFun Point是你描述的邏輯在你的問題中表示「AND」而不是「OR」。最多一個「OR」只適用於字段的多個可能值,被'$ in'(縮寫爲'$或'爲一個值或'null')和$存在'測試應該覆蓋該領域甚至不存在。 –

0

這可能不是完美的解決方案,但你可以做這樣的事情:

var filter = { }; 

filter._id = { $ne: Meteor.userId() }; 

if(Meteor.country()){ 
    filter.country = Meteor.country(); 
}; 

if(Meteor.gender()){ 
    filter.gender = Meteor.gender(); 
}; 

return Meteor.users.find(filter).fetch(); 

而且,因爲你不知道該查詢是要執行什麼樣的基礎上,你不應該使用運營商如$and$or

的查詢文件,您爲所有用戶準備了查詢,其中_id不等於Meteor.userId()ANDcountry =澳大利亞gender =女性。

另外,zangw建議的解決方案中,$和不是必需的,因爲find方法的查詢文檔中的所有條件都是隱式「與」運算。

希望這會有所幫助。

+0

非常感謝。 。讓我試着用你的解決方案做一些測試。 。 –