2017-06-06 22 views
0

MongoDBに正しいコレクションが存在しないLEFT JOINクエリに相当するものはありますか?MongoDB - 1つのコレクションが存在しないLEFT JOINの同等語

SQL:

SELECT * FROM TableA as A LEFT JOIN TableB as B ON A.id = B.id 
WHERE B.Id IS NULL 

のMongoDB:???

P.S:私の初期のスケッチ:まあ、あなたの編集は基本的に答えを持っている

db.getCollection('collA').aggregate([ 
    { 
     $lookup: 
     { 
      from: "collB", 
      localField: "_id", 
      foreignField: "_id", 
      as: "collB" 
     }   
    } 
    //, {$match : collB is empty} 
]) 
+0

"left"は常に保持されていますが、項目には値が設定されているため、この文は['$ lookup'](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)とまったく同じです。 ** **は結合されたコレクションから一致するもののみです。 '$ lookup'の配列が空のときにソース(" left ")コレクションを完全に除外する方法を質問していますか?実際にはここに示したSQLと同じではありません。 –

+0

@NeilLunnはい、あなたは私をよく理解しています。しかし、私のSQLクエリは正しいです。同じIDを持つ2つのコレクションがありますが、最初のコレクションには追加のドキュメントがあります。この追加のドキュメントを取得したいと思います。 – Palindromer

+0

"collA"と一致しない "collB"からですか?それは質問ですか?または「collA」から?あなたが実際に "collA"でこれがまさに '$ lookup'がすることであると言われているからです。 –

答えて

0

。単に$match配列が空である:0の配列インデックスの

db.getCollection('collA').aggregate([ 
    { "$lookup": { 
     "from": "collB", 
     "localField": "_id", 
     "foreignField": "_id", 
     "as": "collB" 
    }}, 
    { "$match": { "collB.0": { "$exists": false } } } 
]) 

$existsテストは、クエリに依頼する最も効率的な方法は、「これはその中のアイテムを配列である」です。

+0

ありがとう、私はあなたの答えは正しいと思いますが、私は数時間後にそれを試すことができます。 – Palindromer

+0

@Palindromerまあ、私が元々コメントに書いていたところでは、かなり単純です。 '$ lookup'を実行すると、結果は、指定されたキーに"一致 "したドキュメントを含む配列になります。一致が全くない場合、配列は空です。だから私たちは単に "空"をテストし、そのテクニックはずっとずっと続いていました。配列上で '$ size'を使って' $ redact'することもできますが、それは簡単なクエリ条件が成立するときには本当に残念です。 –

関連する問題