2016-11-17 44 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)上添加索引, –

相关问题