2016-08-16 16 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コレクションは、次の2つの文書を持っている次のドキュメントがあり

[ 
    { 
     "_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が指定されています。 groupsコレクション

  • $match_idusers.groups$projectからidを使用してユーザ_idフィールドに

    • $match
    • $projectidの前のステップ
    • $lookupの結果からrequestsにあると、現在のユーザーIDはdenied_requestsアレイにありません。これに

    サンプル入力

    サンプル入力はこれに

    サンプル出力は、要求の次のリストになり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

    私はちょうどDBことに気づいた後に返されていないように見えます私はagaisnt <3.2であったので、$ルックアップはサポートされておらず、黙って失敗していました。 – TheJediCowboy

    +0

    https://github.com/facebook/react-native/issues/7626私はこれをカバーすると信じています。 – TheJediCowboy

    関連する問題