我在PyMongo中使用$ lookup成功"加入"两个集合(这是有效的)。我遇到的问题是,我加入的第二个集合在返回所有记录时可能会超出BSON文档大小。
我希望使用$ limit来限制允许加入" match_docs"例如:"评论"最多100条记录每个obj_id:
db.indicators.aggregate([
{
"$lookup": {
"from": "comments",
"localField": "_id",
"foreignField": "obj_id",
"as": "match_docs"
}
}
])
我尝试了各种类型的$ limit,它似乎只限制了总体结果的总数,而不仅仅是为了加入。
答案 0 :(得分:5)
从MongoDB 3.6开始,您可以使用不相关的子查询来限制查找:
db.indicators.aggregate([
{ $lookup: {
from: 'comments',
as: 'match_docs',
let: { indicator_id: '$_id' },
pipeline: [
{ $match: {
$expr: { $eq: [ '$obj_id', '$$indicator_id' ] }
} },
// { $sort: { createdAt: 1 } }, // add sort if needed (for example, if you want first 100 comments by creation date)
{ $limit: 100 }
]
} }
])
答案 1 :(得分:3)
我能够弄明白。
$ lookup - > $ match - > $项目
db.indicators.aggregate([{
"$lookup": {
"from": "comments"
, "localField": "_id"
, "foreignField": "obj_id"
, "as": "match_docs"
}
}, {
"$match": {
"match_docs": {
"$exists": True
}
}
}, {
"$project": {
"match_docs_agg": {
"$slice": ["$match_docs", 3]
}
}
}])
答案 2 :(得分:1)
如果您在$unwind
之后立即执行$lookup
,则会优化管道,基本上将两个阶段结合起来,有助于绕过$lookup
返回时可能导致的16MB限制大量文件。
请记住,如果外部集合中的单个文档加上本地集合中文档的大小超过16 MB,则此优化无济于事。
答案 3 :(得分:-1)
这样,我们可以使用限制聚合来过滤记录。根据我们的要求,我们可以通过极限值。这里有一个有用的链接Docs link
db.getCollection('botAnalytics').aggregate([{
$match: { applicationId: "15077a8c38657a61b844e6a" },
},
{ $limit : 5 },
{
$lookup: {
from: "movie",
localField: "botKey",
foreignField: "key",
as: "botDetails",
},
}])