2016-08-16 3 views
1

У меня есть две коллекции users и `groups. Давайте сделаем вид, что коллекции в настоящее время имеют следующие данные.

users коллекция имеет следующий документ

{ 
    "_id":"57a944390b1acf0d069388c1", 
    "first":"John", 
    "last":"Smith", 
    "email":"[email protected]", 
    "groups":[ 
     { 
     "id":"57aab09c0b1acf135a6b6856", 
     "name":"Group A" 
     }, 
     { 
     "id":"57aab0ed0b1acf135a6b6857", 
     "name":"Group B" 
     }, 
     { 
     "id":"57b008be31a5a202ee4ff47b", 
     "name":"Group C" 
     } 
    ] 
} 

groups коллекции имеет следующие два документа

[ 
    { 
     "_id":"57aab0ed0b1acf135a6b6857", 
     "name":"Group B", 
     "requests":[ 
     { 
      "_id":"57b14b1831a5a2756fbc9873", 
      "description":"Request A", 
      "denied_requests":[ ] 
     } 
     ] 
    } { 
     "_id":"57b008be31a5a202ee4ff47b", 
     "name":"Group C", 
     "requests":[ 
     { 
      "_id":"57b14c2131a5a2756fbc9874", 
      "description":"Request B", 
      "denied_requests":[ ] 
     }, 
     { 
      "_id":"57b14e3131a5a2756fbc9875", 
      "description":"Request C", 
      "denied_requests":[ 
       "57a944390b1acf0d069388c1" 
      ] 
     } 
     ] 
    } 
] 

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

Я бы предположил, что это будет состоять из следующих шагов: psudo шагов, заданных user_id как вход в проблему.

  • $match на пользователя _id поле
  • $project группа id ы от результата предыдущего шага
  • $lookup с использованием id из $project на users.groups на _id из groups коллекции
  • $match на requests, которые не имеют текущего идентификатора пользователя в denied_requests массив по запросу.

Пример ввод

Sample вход это будет 57a944390b1acf0d069388c1, представляющие пользователями _id

Пример вывод

Пример вывод на это был бы следующий список запросов, которые пользователь не отказал.

[ 
     { 
      "_id":"57b14b1831a5a2756fbc9873", 
      "description":"Request A", 
      "denied_requests":[] 
     }, 
     { 
      "_id":"57b14c2131a5a2756fbc9874", 
      "description":"Request B", 
      "denied_requests":[ ] 
     } 
] 

ответ

1

Выполните следующий трубопровод, он должен дать вам желаемый результат:

var userId = "57a944390b1acf0d069388c1"; 
db.users.aggregate([ 
    { "$match": { "_id": userId } }, 
    { "$unwind": "$groups" }, 
    { 
     "$lookup": { 
      "from": "groups", 
      "localField": "groups.id", 
      "foreignField": "_id", 
      "as": "group" 
     } 
    }, 
    { "$unwind": "$group" }, 
    { 
     "$project": { 
      "requests": { 
       "$filter": { 
        "input": "$group.requests", 
        "as": "item", 
        "cond": { "$not": { 
         "$setIsSubset": [ 
          [userId], "$$item.denied_requests" 
         ] 
        } } 
       } 
      } 
     } 
    }, 
    { "$unwind": "$requests" }, 
    { 
     "$project": { 
      "_id": "$requests._id", 
      "description": "$requests.description", 
      "denied_requests": "$requests.denied_requests" 
     } 
    } 
]) 
+0

Я попробовал это, и это выглядит как будто ничего не возвращается после того, как первый '$ lookup' – TheJediCowboy

+1

Я просто понял, что БД Я собирался выполнить agaisnt <3.2, что означает, что $ lookup не поддерживается и терпит неудачу. – TheJediCowboy

+0

https://github.com/facebook/react-native/issues/7626 Я считаю, что это охватывает. – TheJediCowboy

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