2016-07-07 1 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"]}}) 

Но это не так, сог, если любой студент, который зарегистрирован только для науки также будет в результате. Я не могу использовать «$ all», так как наука и английский находятся в двух разных документах.

Есть ли способ достичь этого легко и эффективно?

+1

Поскольку в mongo нет объединений, вы не можете сделать прямой запрос для него. Как насчет использования структуры агрегации ?. Группируйте по id, используйте $ addToSet, чтобы добавить все темы, а затем использовать фазу соответствия с $ all? –

+0

@ Ишань Сони Спасибо Ишану за тебя. Да. Я попробовал агрегацию. Я дал запрос, который я попробовал ниже. Но я беспокоюсь о производительности. Есть ли другой способ? – 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 также является единственным значением, тогда я буду агрегировать без пользы!

Специалисты Mongo, пожалуйста, поделитесь своими взглядами на мою ситуацию.

+0

Вы делаете это правильно. – styvane

+0

@SSDMS Спасибо, что указали примерно $ lookup. Но, я не уверен, как $ lookup может помочь мне в моем состоянии. Не могли бы вы помочь мне понять, может ли $ lookup помочь мне в вышеупомянутой проблеме? – Nattyk

+0

'$ lookup' здесь не может помочь. И, как я уже сказал, вы делаете это прямо сейчас. – styvane

 Смежные вопросы

  • Нет связанных вопросов^_^