2016-07-07 41 views
1

說我有兩個文件蒙戈:是能夠滿足「與」條件對兩個文件

/*1*/ 
{ 
"id":1, 
"name":"natty", 
"subject_enrolled":"english" 
} 
/*2*/ 
{ 
"id":2, 
"name":"natty", 
"subject_enrolled":"science" 
} 

理想的情況下,它應該是相同的文檔,與subject_enrolled是具有這兩個問題的陣列。但由於某種原因,我保持我的數據是這樣的。 現在,我想寫一個查詢,它將檢索所有已經註冊了「英語」和「科學」的學生。

我想下面的查詢:

db.students.find({"subject_enrolled":{"$in":["science", "english"]}}) 

但是,這是錯誤的,如果堂妹誰註冊的唯一的科學任何學生也將在結果中。我不能使用「全部」,因爲科學和英語都有兩個不同的文檔。

有沒有辦法輕鬆有效地實現這一點?

+1

由於mongo中沒有連接,因此無法直接對其進行查詢。如何使用聚合框架?按ID分組,使用$ addToSet添加所有主題,然後使用$ all的匹配階段? –

+0

@IshanSoni謝謝Ishan給你看。是。我嘗試了聚合。我在這裏給出了我在下面試過的查詢。但我擔心表現。有沒有其他方法可行? – Nattyk

+0

我想不出有什麼辦法。等待其他人迴應,同時謹防聚合管道的一些限制。 https://docs.mongodb.com/manual/core/aggregation-pipeline-limits/#result-size-restrictions –

回答

0

我現在所能想到的就是使用聚合。

db.students.aggregate([{"$group":{"_id":"$name", "subject_enrolled":{"$addToSet":"$subject_enrolled"}}}, {"$match":{"subject_enrolled":{"$all":["english", "science"]}}}]) 

這完美地滿足了我的條件。

但我只擔心表現。如果我已經說了10,000個文檔,最壞的情況是我的所有文檔都是針對個別學生的,而查詢Param也是一個單一的值,那麼我就會聚集在一起!

蒙戈專家請分享您對我的情況的看法。

+0

你做得對。 – styvane

+0

@SSDMS謝謝你指出$ lookup。但是,我不確定,$ lookup在我的情況下可以如何幫助我。你能幫我理解,$ lookup可以幫助我解決上述問題嗎? – Nattyk

+0

'$ lookup'在這裏幫不了忙。就像我說的,你已經做得很好。 – styvane