2016-07-07 61 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