2017-12-29 15 views
0

MongoDBのクエリと集計パズルがあります。いくつかのサンプルレコードを拳:ドキュメントのサブセットの一意のフィールド値

# Document 1 
{ 
    items: [ 
    { 
     type: "X", 
     id: 123 
    }, 
    { 
     type: "Y", 
     id: 456 
    } 
    ] 
} 

# Document 2 
{ 
    items: [ 
    { 
     type: "A", 
     id: 789 
    }, 
    { 
     type: "B", 
     id: 321 
    } 
    ] 
} 

# Document 3 
{ 
    items: [ 
    { 
     type: "P", 
     id: 987 
    }, 
    { 
     type: "X", 
     id: 654 
    } 
    ] 
} 

# Document 4 
{ 
    items: [ 
    { 
     type: "Q", 
     id: 246 
    }, 
    { 
     type: "X", 
     id: 654 
    } 
    ] 
} 

は、私の目標は、idtype: X要素に関連付けられているidあるtype: Xを含む文書のためのすべての個別id値を見つけることです。

例えば、上記では、私がする私の結果を希望するものである:

[ 123, 654 ]

これらはtype: Xに関連付けられているidフィールドの一意の値です。

答えて

1

あなたの商品はunwindingで始まります。次に、タイプで除外することができます。最後のステップでは、$addToSet演算子を使用して重複を排除します。 _id: 1でグループ化

db.collection.aggregate([ 
    { $unwind: "$items" }, 
    { $match: { "items.type": "X" } }, 
    { 
    $group: { 
     _id: 1, 
     ids: { $addToSet: "$items.id" } 
    } 
    } 
]) 

は、私が何によってグループ分けてることを意味します。私はすべてが一つだけのグループの一部であることを知っているが、私は$ addToSetを使用する必要があります。

1

以下の集計を使用してユニークなIDを取得できます。

クエリ$filtersは、タイプが入力タイプであるアイテムの後に一致するアイテムを投影するために$arrayElemAt、IDフィールドを抽出するために$letが続きます。

$group$addToSetのすべての項目に固有の値を出力するID値。

db.collection_name.aggregate([{"$group":{ 
    "_id":null, 
    "ids":{ 
    "$addToSet":{ 
     "$let":{ 
     "vars":{ 
      "obj":{ 
      "$arrayElemAt":[ 
       {"$filter":{ 
       "input":"$items", 
       "cond":{"$eq":["$$this.type","X"]} 
       }}, 
       0 
      ] 
      } 
     }, 
     "in":"$$obj.id" 
     } 
    } 
    } 
}}]) 
関連する問題