2017-07-04 23 views
0

2つのコレクションがあります ユーザー{id、 $ lookupを使ってコードを書こうとしましたが、すべてのファイルがユーザーに属し、 "abc.xyz"という名前でフィルタリングされていないので、次のクエリを書きました。名前によってそれをフィルタリング「abc.xyz」Mongo 2番目のコレクションに2つのコレクションを追加して条件を追加する方法

db.user.aggregate([ 
{"$lookup": 
    { 
     "from": "files", 
     "localField": "id", 
     "foreignField": "userId", 
     "as": "fileList" 
    } 
}, 
{"$project": { "filList":{ 
    "$filter": { 
        "input":"$fileList", 
        "as":"file" 
        "cond": {"$eq": ["$file.name","abc.xyz"]} 
      } 
      } 
     } 
} 
]) 

は、私は、ファイル名が「abc.xyz」すべてのファイルを検索したい

+1

あなたは '$'を欠けています。 '' $ eq ''でなければなりません:["$$ file.name"、 "abc.xyz"] '' $ file'ではなく '$$ file''です。ここで問題となるのは、 '$ lookup'は、指定された条件にマッチするのとは対照的に、外部キーにマッチしたドキュメントを"すべて "返すことです。小さな結果セットではこれは問題ありません。 –

+0

どうやったら違うのか教えてください私はmongoDBを新しくしています。あなたの提案は歓迎されます – Ganesh

+1

[$ lookupから配列全体の要素のフィルタリングされた数を取得](https:// stackoverflow.com/questions/44888354/get-filtered-count-of-elements-in-array-from-lookup-along-with-the-whole-docume/44897438#44897438)。ちょうど答えて、正しい方法を説明します。 '$ lookup'の結果として配列をフィルタリングします。 –

答えて

0

ありがとう...しかし、取得したすべてのファイルは、ユーザーに属しありません

上記の質問に基づいて、「所有者情報と共に名前abc.xyzのすべてのファイルを検索する」と解釈することもできます。

この場合、最初に$matchを使用してファイルコレクションをフィルタリングして、ファイル名をabc.xyzにフィルタする方がよいでしょう。これにより、両方のコレクションのperfomingルックアップの代わりに、usersコレクションにルックアップするドキュメントの数が制限され、次にフィルタリングが実行されます。例えば

db.files.aggregate([ 
    {"$match": {"name":"abc.xyz"}}, 
    {"$lookup": { 
       "from": "users", 
       "localField": "userId", 
       "foreignField": "_id", 
       "as": "users" 
       } 
    }]); 

コレクションは今usersに見上げfilesから、逆にされていることに注意してください。例の結果は次のようになります。

"result": [ 
    { 
     "_id": 111, 
     "userId": 999, 
     "name": "abc.xyz", 
     "owner": [ 
     { 
      "_id": 999, 
      "name": "xmejx" 
     } 
     ] 
    }, 
    { 
     "_id": 222, 
     "userId": 998, 
     "name": "abc.xyz", 
     "owner": [ 
     { 
      "_id": 998, 
      "name": "kalwb" 
     } 
     ] 
    } 
    ] 

私はまた、チェックアウトすることをお勧めします:

関連する問題