2017-02-07 4 views
0

Итак, я пытаюсь написать запрос в MongoDB, который полагается на часть запрашиваемого документа, чтобы вернуть документ, который я хочу.Mongodb Query, который полагается на тот же документ

Это пример формата этих документов:

{ 
    "_id" : ObjectId("58990510cdab041b39c78dd1"), 
    "classcode" : "CS433", 
    "department" : "CS", 
    "instructor" : { 
      "name" : "Mike", 
      "office" : "Starbucks" 
    }, 
    "students" : [ 
      { 
        "name" : "Dave", 
        "major" : "CS", 
        "gradyear" : 2019 
      }, 
      { 
        "name" : "Joe", 
        "major" : "CS", 
        "gradyear" : 2018 
      }, 
      { 
        "name" : "Stan", 
        "major" : "CS", 
        "gradyear" : 2017 
      } 
    ] 
} 

Я хочу использовать строку, которая обозначает отдел, чтобы помочь увидеть, если есть не подходит для этого отдела в мажоре. то есть, если отделом является CS, тогда он проверяет, есть ли ученик, у которого нет основной роли CS.

Я знаю $ne, $elemMatch, а что нет. У меня просто проблемы с использованием другой части документа, чтобы помочь запросу. Я не думаю, что здесь будет использоваться дополнительный запрос.

ответ

1

Вы можете использовать $redact.

$redact пройти уровень документа в то время, и искать major поля рекурсивно и выполнять $$DESCEND и $$PRUNE по критериям из $$ROOT уровня.

Запрос будет содержать всех студентов, у которых нет major, соответствующих department.

db.collection.aggregate([{ 
    "$redact": { 
     "$cond": [{ 
       $ne: ["$major", "$$ROOT.department"] 
      }, 
      "$$DESCEND", 
      "$$PRUNE" 
     ] 
    } 
}]) 

Update:

Этот запрос возвращает все документы, когда есть хотя бы один студент с major не соответствуя department.

db.collection.aggregate([ 
    { $redact: { 
     $cond: { 
      if: { "$ifNull" : ["$department", false] }, 
      then: { $cond: { 
       if: { $anyElementTrue: { 
        $map: { 
         input: "$students", 
         as: "student", 
         in: { $ne: [ "$$student.major", "$$ROOT.department" ] } 
        } 
       }}, 
       then: "$$DESCEND", 
       else: "$$PRUNE" 
      }}, 
      else: "$$DESCEND" 
     } 
    }} 
]) 
+0

Это возвращает только весь документ, но без документов различных студентов в массиве. Я хочу вернуть все документы, в которых, по крайней мере, один из основных студентов не совпадает с департаментом этого класса. –

+0

Можете ли вы попробовать обновленный запрос? и добавьте ожидаемый ответ на сообщение, если это не работает так, как вы планируете. – Veeram

+0

Обновленный запрос возвращает правильный объект. Знаете ли вы о каких-либо возможных способах выполнения этого без использования функции агрегации, но с функцией поиска? Мне сказали, что запрос, чтобы найти мой ответ, должен был быть довольно простым и может быть выполнен без функции агрегации. –