2016-11-17 86 views
3

文件我有以下模式:查詢針對具有依賴元素另一個集合

Collection1 
    name 
    slug 
Collection2 
    name 
    slugCollection1 

「鏈接」 Collection1Collection2之間是穿過田野slugslugCollection1

我想創建一個查詢,該查詢返回Collection1中的元素,並帶有一個新的計算布爾屬性,該布爾屬性指示Collection2中是否存在(或不依賴)元素。

對於這一點,我創建了以下查詢:

[ 
    { 
    "$lookup": { 
     "from": "Collection2", 
     "localField": "slug", 
     "foreignField": "slugCollection1", 
     "as": "elements" 
    } 
    }, 
    { 
    "$project": { 
     "_id": 0, 
     "id": "$id", 
     "name": 1, 
     "slug": 1, 
     "hasElements": { 
     $gt: [ { $size: '$elements' }, 0 ] 
     } 
    } 
    } 
] 

我對這個性能問題時,有很多在這兩個集合,甚至下面的錯誤元素:

MongoError: Total size of documents in collection2 matching { slug: { $eq: "paymill" } } exceeds maximum document size 

是還有另一種方式來實現這樣的要求?謝謝!

+0

你需要在'collection1'所有字段?您也可以將['allowDiskUse'](https://docs.mongodb.com/manual/reference/command/aggregate/#dbcmd.aggregate)設置爲'true'來寫入臨時文件 – styvane

+0

您是什麼意思所有字段?我不需要collection2中的所有「加入」字段,實際上只有一個能夠使用'$ size'。是否可以指定要包含在'$ lookup'級別的字段。謝謝! –

+0

我的意思是,如果你不需要「collection1」中的所有文檔字段,那麼你可以先投影它們並丟棄這些字段。但是你可以爲「collection2」做同樣的事情。另外嘗試使用'allowDiskUse'來查看它是否有幫助。如果這不起作用,您可能需要更改文檔結構或使用兩種不同的查詢來獲得最終結果。 – styvane

回答

1

您可以$查找前添加$項目階段,因此您可以只使用所需的字段來查找

 { 
     "$project": { 
      "name": 1, 
      "slug": 1 
     } 
} 
+0

非常感謝您的回答!實際上,我認爲問題是因爲collection2中的字段。而不是「$ lookup」,我希望在collection2中有一個「count」對應的行,或者在collection2的一個子集中有一個「$ lookup」(在我的例子中,'_id'就足夠了)。這有可能嗎? –

+0

不,你不能在$ lookup中這樣做,用於連接的字段是需要時間加入的字符串。在收集字段(slug,slugCollection1)上添加索引, –

相關問題