我们假设我有两个集合collection-A
和collection-B
,它们包含的数据如下例所示
收集-A
{adId:1,adName:'x'}
{adId:2,adName:'y'}
{adId:3,adName:'z'}
.
.
集合-B [此集合每行有数百万行
adId
]
{adId:1, ip:'1.2.3.4',viewCount:2}
{adId:1, ip:'1.2.3.5',viewCount:3}
{adId:2, ip:'1.2.3.6',viewCount:1}
{adId:3, ip:'1.2.3.4',viewCount:1}
.
.
现在假设我想查询collection-A
,以便我希望collection-A
中adId
中没有相应collection-B
行的所有行的名称{ {1}}和Ip: 1.2.3.4
超过2个。
我已经编写了以下条件的MongoDB聚合查询,似乎有效
count
如果 [
{
$match: {}
},
{
$lookup: {
from:'collection-B',
localField:"adId",
foreignField: "adId",
as:'transaction'
}
},
{
$match:{
transaction:{
$not:{
$elemMatch:{
"ip":"1.2.3.4",
count:{$gte:2}
}
}
}
}
},
]
中的匹配行数量为几千,但如果collection-B
中的匹配行数为几十万/百万,则上面的查询可以正常工作,那么我会收到错误{{1我理解为什么,因为所有匹配的行被合并到一个数组中,并且数组被附加到collection-B
的父行,因此超出了允许的最大文档大小。
我找到了另一个问题的解决方案,即在查找之后立即使用MongoError: Total size of documents exceeds maximum document size
运算符,这与collection-A
的每个对应行添加父$unwind
行完全相反unwind解决了问题,但在这种情况下,要搜索的行数增加到如此大的程度,以至于搜索需要大约30秒。现在我正在考虑任何第三种方法,比如在查找运算符本身中放置搜索条件,但我不知道我是否可以在查找运算符内部使用搜索查询,我甚至不确定我的解决方案是否正确。
对于可能的解决方案的任何评论或暗示将不胜感激