MongoDB聚合限制查找

时间:2017-06-07 13:12:07

标签: mongodb join aggregation-framework pymongo

我在PyMongo中使用$ lookup成功"加入"两个集合(这是有效的)。我遇到的问题是,我加入的第二个集合在返回所有记录时可能会超出BSON文档大小。

我希望使用$ limit来限制允许加入" match_docs"例如:"评论"最多100条记录每个obj_id:

db.indicators.aggregate([
  {
    "$lookup": {
      "from": "comments",
      "localField": "_id",
      "foreignField": "obj_id",
      "as": "match_docs"
    }
  }
])

我尝试了各种类型的$ limit,它似乎只限制了总体结果的总数,而不仅仅是为了加入。

4 个答案:

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