MongoDB聚合限制查询

gle*_*783 3 join mongodb pymongo aggregation-framework

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

我想使用$ limit来限制“ match_docs”下允许加入的记录数,例如:每个obj_id的“ comments”中最多记录100条记录:

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

我尝试了各种类型的$ limit,它似乎仅限制了整个结果的总数,而不仅限于联接。

Dan*_*yev 7

从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 }
  ]
} }
])
Run Code Online (Sandbox Code Playgroud)

  • 难道只有我一个人这个方法不起作用吗?不知何故,它不是限制“comments”集合的结果,而是限制我正在查找的父集合的结果 (3认同)

Pet*_*ano 3

如果您$unwind紧随 a 之后执行 a $lookup,则管道将得到优化,基本上结合了 2 个阶段,有助于绕过因返回$lookup大量文档而可能导致的 16MB 限制。

请记住,如果外部集合中的单个文档加上本地集合中的文档大小超过 16 MB,则此优化无济于事。