2017-06-06 129 views
0

是否有一個等價於LEFT JOIN查詢,其中權限集合在MongoDB中不存在?MongoDB - 等價的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

該聲明正是['$ lookup'](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)所做的,因爲「左」始終保留,但項目已填充到目標數組只有**只有**從已加入的集合中匹配。你可能會問,當$'lookup'的結果數組爲空時,如何完全排除源(「左」)集合?這實際上與這裏介紹的SQL不一樣。 –

+0

@ NeilLunn是的,你很瞭解我。但我的sql查詢是正確的。我有兩個具有相同ID的集合,但第一個集合具有其他文檔。我想檢索這些額外的文件。 – Palindromer

+0

從「collB」不匹配「collA」?這是個問題嗎?還是從「collA」?因爲你實際上被告知用「collA」,這正是'$ lookup'所做的。 –

回答

0

嗯,你的編輯主要有答案。只要$match其中數組是空的:

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

上的0數組索引的$exists測試是要求在查詢的最有效方法「是這樣的,在它的項目的數組」。

+0

謝謝,我認爲你的回答是正確的,但我可以在幾個小時後嘗試。 – Palindromer

+0

@Palindromer那麼這個案例非常簡單,我最初在評論中得到了什麼。當你查找結果是一個數組,其中包含與給定鍵「匹配」的文檔。如果根本沒有匹配,那麼數組是空的。所以我們只測試「空白」,而且這項技術已經存在很長時間了。我們還可以在數組上使用'$ size'對'$ redact'進行'$ redact',但當簡單的查詢條件執行時,這確實是過度殺傷性的。 –