2017-07-04 25 views
0

我有兩個集合 users {id,name}和文件{id,userId,name}我想查找所有文件名爲「abc.xyz」 ,我試圖使用$ lookup編寫代碼,但獲取所有文件屬於用戶,而不是按名稱「abc.xyz」過濾它,我寫了以下查詢。Mongo如何加入第二個集合中的兩個集合並添加條件

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"]} 
      } 
      } 
     } 
} 
]) 

謝謝

+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」的所有文件......但讓所有的文件屬於用戶而不是按名稱對其進行篩選「abc.xyz」

根據上述問題,也可以解釋爲「查找名稱爲abc.xyz的所有文件及其所有者信息」。

在這種情況下,最好先使用$match過濾文件集,以過濾文件名等於abc.xyz。這會限制文件的數量,以查找users集合,而不是對這兩個集合執行查找,然後執行過濾。

例如:

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

請注意收集現在顛倒過來了,從files仰視着users。一個例子的結果將是:

"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" 
     } 
     ] 
    } 
    ] 

我也建議檢查出: