mongodb聚合$ limit和$ lookup序列问题

时间:2019-02-26 02:45:55

标签: sql mongodb

db.getCollection('xxxxxxxx').aggregate(
   [
      {
        "$match": {
          "campaigns.campaign_id":ObjectId("5c6e50932fb955f81b0c9f59")
        }
      },
      {
        "$sort": {
          "campaigns.updatedAt": 1,
          "_id": -1
        }
      },
      {
        "$limit": 15
      },
      {
        "$lookup": {
          "from": "callresults",
          "localField": "currentStat.sales_funnel_id",
          "foreignField": "_id",
          "as": "sale_funnels"
        }
      },
      {
        "$lookup": {
          "from": "callresults",
          "localField": "currentStat.callresult_id",
          "foreignField": "_id",
          "as": "callresults"
        }
      },
      {
        "$lookup": {
          "from": "accounts",
          "localField": "currentStat.qc.account_id",
          "foreignField": "_id",
          "as": "accounts"
        }
      },
      {
        "$match": {
          "$or": [
                     {
                        "姓名": /137/
                      },
                      {
                           "电话号码": /137/
                      },
                      {
                           "电子邮件": /137/
                      },
                      {
                            "城市": /137/
                      },
                      {
                            "区域": /137/
                      },
                      {
                            "备注": /137/
                      }
          ]
        }
      }
]
)

执行上述SQL查询的结果为0($ limlit在$ lookup之前) 执行上述SQL查询的结果为0($ limlit在$ lookup之前) 执行上述SQL查询的结果为0($ limlit在$ lookup之前)

如果$ limlit跟在$ lookup之后

db.getCollection('xxxxxxxxxxx').aggregate(
   [
      {
        "$match": {
          "campaigns.campaign_id":ObjectId("5c6e50932fb955f81b0c9f59")
        }
      },
      {
        "$sort": {
          "campaigns.updatedAt": 1,
          "_id": -1
        }
      },
      {
        "$lookup": {
          "from": "callresults",
          "localField": "currentStat.sales_funnel_id",
          "foreignField": "_id",
          "as": "sale_funnels"
        }
      },
      {
        "$lookup": {
          "from": "callresults",
          "localField": "currentStat.callresult_id",
          "foreignField": "_id",
          "as": "callresults"
        }
      },
      {
        "$lookup": {
          "from": "accounts",
          "localField": "currentStat.qc.account_id",
          "foreignField": "_id",
          "as": "accounts"
        }
      },
      {
        "$match": {
          "$or": [
                     {
                        "姓名": /137/
                      },
                      {
                           "电话号码": /137/
                      },
                      {
                           "电子邮件": /137/
                      },
                      {
                            "城市": /137/
                      },
                      {
                            "区域": /137/
                      },
                      {
                            "备注": /137/
                      }
          ]
        }
      },
      {
        "$limit": 15
      }
]
)

那是为什么? 这是为什么? 这是为什么? 这是为什么? 为什么会这样?

2 个答案:

答案 0 :(得分:0)

在第一种情况下(查找前限制),仅对前15个匹配的文档执行查找。但是,当限制在管道的末尾时,将对所有匹配的文档进行查找,然后应用该限制。

举一个简单的例子

此查询查找字段“ n”的值为1的所有文档,然后显示前15个匹配的文档。

db.collection.aggregate([{$match: {"n" : 1}}, {$limit: 15}])

但是,以下查询将获取前15个文档,然后仅对这15个文档进行匹配。

db.collection.aggregate([{$limit: 15}, {$match: {"n" : 1}}])

答案 1 :(得分:0)

1)在第一种情况下。您将结果限制为15,并执行匹配条件。因此,匹配条件仅适用于15个文档。

2)在第二种情况下,您要匹配集合中的所有文档,然后限制结果。