2016-09-12 10 views
8

現在、配列集計演算子$filter$in演算子を使用することはできません。

だが、これは文書スキーマであるとしましょう:

{ 
    _id: 1, 
    users: [ 
     { 
      _id: 'a', 
      accounts: ['x', 'y', 'z'] 
     }, 
     { 
      _id: 'b', 
      accounts: ['j','k','l'] 
     } 
    ] 
} 

私が欲しい、accounts配列の内容に基づいてusersのフィルタ配列で文書を取得するには、aggregateを使用します。$in$filterオペレータで動作するかどう

、私はそれがこのように見えることを期待する:filtered_users

db.test.aggregate([ 
    { 
     $project: { 
      'filtered_users': { 
       $filter: { 
        input: '$users', 
        as: 'user', 
        cond: { 
         $in: ['$$user.accounts', ['x']] 
        } 
       } 
      } 
     } 
    } 
]) 

とリターンをのみX以来、最初のユーザーが自分でですアカウント。

しかし、私が言ったように、これは動作しないと、私はエラーを取得:それは$filterオペレータではサポートされていないため

"invalid operator '$in'"

を。私はドン」 -

今、私は$unwindでそれを行うと、通常の$match演算子を使用することができます知っているが、それははるかに長い(そして醜い)になる配列として戻って結果を設定する$groupを使用することの必要性と集約これをしたい

希望の結果を得るために$filterオペレータを操作する他の方法がある場合は、私の質問です。

答えて

10

$inはarrayの集約演算ではサポートされていませんので、代わりに$setIsSubsetを使用してください。この詳細についてはthisリンクを参照してください。集計クエリでは、今user.accountsの配列のサブセットとして[x]を持っている唯一の要素を返します

db.test.aggregate([ 
{ 
    $project: { 
     'filtered_users': { 
      $filter: { 
       input: '$users', 
       as: 'user', 
       cond: { 
        $setIsSubset: [['x'], '$$user.accounts']   
       } 
      } 
     } 
    } 
}]) 

このクエリのようになります。

+0

素敵な答えで$in集計演算子を使用することができます!ありがとう – TomG

8

のMongoDB 3.4から始めて、あなたは$project段階

db.collection.aggregate([  
    {   
     "$project": {    
      "filtered_users": {     
       "$filter": {      
        "input": "$users",      
        "as": "user",      
        "cond": { "$in": [ "x", "$$user.accounts" ] }      
       } 
      }   
     }  
    } 
]) 
+0

正しい形式は次のようなものです: "cond":{"$ in":["$$ user.accounts"、["x"]]} – Eric

+0

@Eric私はそうは思わない。 OPのクエリが間違っています。 OPが望んでいるのは、** x **が自分のアカウント*に入って以来、最初のユーザーだけfiltered_usersで*返されます。あなたは質問のその部分を逃した。 – styvane

関連する問題