2017-07-19 17 views
1

をフィルタリングし、私は次のような構造を持っている文書のコレクションがあります。 enter image description hereマッチ配列要素と

両リーグやエントリは、私が(おくつろぎ配列である)を、その後私は、発生したことを見つける必要がありますドキュメントのプロパティ "nick"は "playerOrTeamName"に表示されます。

db.getCollection('summoners').aggregate([ 
    {"$skip": 0}, 
    {"$limit": 2}, 
    {'$unwind': '$leagues'}, 
    {'$unwind': '$leagues.entries'}, 
    {'$match': {'leagues.entries.playerOrTeamName': '$nick'}}, 
],{ 

allowDiskUse:真 })

なぜ0結果の "一致" 部分の結果だろうか?私は、プレイヤーのニックネームが常にエントリの配列に発生することを保証することができます。

PS:"$nick"が別のフィールドの値であることを意味するので、これが失敗した制限= 2単純化の酒のために使用さ

+0

質問に答えられていないと思われる回答がありますか?もしそうなら、答えにコメント**を書いてください。実際に質問に答えた場合は、[**あなたの回答を受け入れる**](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)にご注意ください。あなたが求める質問に –

答えて

1

理由があるが、基本的には「通常のMongoDBのクエリ」である$matchはの概念がありません条件に「一致」するために、既存のフィールド値から「変数を使用する」。 $redactパイプラインステージを使用するか、代わりに$filterを使用して配列の内容を直接フィルタリングするかのいずれかを使用してください。"aggregation logical operators"を使用する必要があります。フィールドの値の「論理的」比較を行い、条件がそれがfalseた結果からtrue又は"$$PRUNE"ある"$$KEEP"に決定

db.getCollection('summoners').aggregate([ 
    {"$skip": 0}, 
    {"$limit": 2}, 
    {'$unwind': '$leagues'}, 
    {'$unwind': '$leagues.entries'}, 
    {'$redact': { 
     '$cond': { 
     'if': { '$eq': [ '$leagues.entries.playerOrTeamName', '$nick' ] } 
     'then': '$$KEEP', 
     'else': '$$PRUNE' 
     } 
    } 
]) 

。アレイ上

直接には、無傷の維持:本質的フィールドの比較のために内側"entries"$filterを適用することによって、アレイを再マッピングし、「外側の」配列は、もはや有する場合

db.getCollection('summoners').aggregate([ 
    { "$skip": 0 }, 
    { "$limit": 2 }, 
    { "$addFields": { 
     "leagues": { 
     "$filter": { 
      "input": { 
      "$map": { 
       "input": "$leagues", 
       "as": "l", 
       "in": { 
       "entries": { 
        "$filter": { 
        "input": "$$l.entries", 
        "as": "e", 
        "cond": { "$eq": [ "$$e.playerOrTeamName", "$nick" ] } 
        } 
       }, 
       "name": "$$l.name", 
       "queque": "$$l.queque", 
       "tier": "$$l.tier" 
       } 
      } 
      }, 
      "as": "l", 
      "cond": { 
      "$gt": [ { "$size": "$$l.entries" }, 0 ] 
      } 
     } 
     } 
    }} 
]) 

"entries"の配列に残った結果も削除されます。