Mongodb聚合在多个匹配和查找阶段后获得总数

时间:2020-09-18 16:51:34

标签: mongodb aggregation-framework

我正在尝试在多个匹配和查找阶段后获取记录总数。我知道count属性给出了1个Matching阶段的计数,但是如果我在聚合中有两个或多个Match阶段,并且在那些Match阶段之间,我也会有lookup阶段。如何获得准确的计数?这是我的总数。

pipeline = [
  {
    $match: {
      statusRepositoryId: new ObjectId(filter.statusRepositoryId),
    },
  },
  {
    $lookup: {
      from: "Parcel",
      localField: "parcelId",
      foreignField: "_id",
      as: "parcel",
    },
  },
  {
    $unwind: {
      path: "$parcel",
    },
  },
  {
    $lookup: {
      from: "ParcelStatus",
      localField: "parcel._id",
      foreignField: "parcelId",
      as: "parcel.parcelStatuses",
    },
  },
  {
    $lookup: {
      from: "CustomerData",
      localField: "parcel.customerDataId",
      foreignField: "_id",
      as: "parcel.customerData",
    },
  },
  { $unwind: "$parcel.customerData" },
  {
    $match: {
      "parcel.customerData.cityId": new ObjectId(filter.cityId),
    },
  },
  { $count: "count" },
];

数据

[
  {
    "parcelId": "RWP900001170670",
    "vendorId": "5eeb04af35109774c533cb55",
    "createdAt": "2020-09-18T14:56:45.587Z",
    "updatedAt": "2020-09-18T14:56:45.587Z",
    "statusRepositoryId": "5dd7fa20dcfa9600152cc2de",
    "reason": "cancelled",
    "checkboxDataArray": [
      "Refused to receive the parcel"
    ],
    "riderId": "5f45ffc61ffedf439ac610c8",
    "image": "https://swyft-attachments-v1.s3.ap-south-1.amazonaws.com/MarkParcelStatus/2ac5fe70-f9bf-11ea-86b3-111fc7495e46.jpeg",
    "parcel": {
      "vendorId": "5eeb04af35109774c533cb55",
      "createdAt": "2020-09-14T14:12:37.835Z",
      "updatedAt": "2020-09-18T15:36:55.525Z",
      "vendorParcelId": "272837",
      "orderType": "COD",
      "boxType": "Flyer",
      "amount": 2550,
      "qty": 2,
      "originCityId": "5ee134da0138634c27a6e1dd",
      "pickupLocationId": "PL-687422",
      "description": "DPL20 555 Suit UPC: LA01611-Std-MLT UPC: custom:Lawn custom:2 Pc Shirt | Lawn Dupatta  UPC: 1DPL20 550 Suit UPC: LA01606-Std-YLW UPC: custom:Lawn custom:2 Pc Shirt | Lawn Dupatta  UPC: 1",
      "weight": 1,
      "additionalServices": [],
      "isPickedUp": true,
      "paymentMode": "cash",
      "isProcessed": true,
      "isOnline": true,
      "customerDataId": "5f5f7a55df396137fdd64cd9",
      "currentStatusId": "5dd7fa20dcfa9600152cc2d8",
      "previousStatusId": "5dd7fa20dcfa9600152cc2de",
      "loadsheetId": "LS-005966",
      "zoneAreaId": "ZONE_NOT_DEFINED",
      "parcelStatuses": [
        {
          "_id": "5f5f7a55df396137fdd64cda",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-14T14:12:37.842Z",
          "updatedAt": "2020-09-14T14:12:37.842Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2e1"
        },
        {
          "_id": "5f631ca20ecb1f33c089e87e",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-17T08:21:54.750Z",
          "updatedAt": "2020-09-17T08:21:54.750Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2dd"
        },
        {
          "_id": "5f6382057e4a061b28f9c23d",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-17T15:34:29.687Z",
          "updatedAt": "2020-09-17T15:34:29.687Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2d8"
        },
        {
          "_id": "5f64426caa7f835b423dc2aa",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-18T05:15:24.439Z",
          "updatedAt": "2020-09-18T05:15:24.439Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2e3",
          "riderId": "5f45ffc61ffedf439ac610c8"
        },
        {
          "_id": "5f64426daa7f835b423dc2c9",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-18T05:15:25.314Z",
          "updatedAt": "2020-09-18T05:15:25.314Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2e2",
          "riderId": "5f45ffc61ffedf439ac610c8"
        },
        {
          "_id": "5f64caadee163f6696f8439a",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-18T14:56:45.587Z",
          "updatedAt": "2020-09-18T14:56:45.587Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2de",
          "reason": "cancelled",
          "checkboxDataArray": [
            "Refused to receive the parcel"
          ],
          "riderId": "5f45ffc61ffedf439ac610c8",
          "image": "https://swyft-attachments-v1.s3.ap-south-1.amazonaws.com/MarkParcelStatus/2ac5fe70-f9bf-11ea-86b3-111fc7495e46.jpeg"
        },
        {
          "_id": "5f64d417cb02f27072f144c8",
          "parcelId": "RWP900001170670",
          "vendorId": "5eeb04af35109774c533cb55",
          "createdAt": "2020-09-18T15:36:55.480Z",
          "updatedAt": "2020-09-18T15:36:55.480Z",
          "statusRepositoryId": "5dd7fa20dcfa9600152cc2d8",
          "adminManagerId": "5dd7fa20dcfa9600152cc2d4"
        }
      ],
      "customerData": {
        "firstName": "Riffat",
        "email": "riffatfhm@yahoo.com",
        "lastName": "faheem ",
        "address": "476A dhoke gujran misrial road Rawalpindi ",
        "addressLocation": {
          "lat": 33.601617,
          "lng": 72.9913365
        },
        "cityId": "5ee134da0138634c27a6e1dc",
        "parcelId": "RWP900001170670",
        "vendorId": "5eeb04af35109774c533cb55",
        "createdAt": "2020-09-14T14:12:37.833Z",
        "updatedAt": "2020-09-17T08:22:06.456Z",
        "customerId": "5f5f7a55df396137fdd64cd8",
        "customer": {
          "phone": "3345174367",
          "createdAt": "2020-09-14T14:12:37.827Z",
          "updatedAt": "2020-09-14T14:12:37.827Z",
          "id": "5f5f7a55df396137fdd64cd8"
        },
        "id": "5f5f7a55df396137fdd64cd9"
      },
      "id": "RWP900001170670"
    },
    "id": "5f64caadee163f6696f8439a"
  }
]

1 个答案:

答案 0 :(得分:0)

OP可能希望主集合中stateRepositoryId等于某物的项目计数,并通过联接链接cityId等于某物的项目计数。在pseudoSQL中:

select count(*) from maintable
left outer join parceltable._id = maintable.parcelId
left outer join customertable._id = parceltable.customerDataID
where maintable.stateRepositoryID = 'ABC'
and customertable.cityID = 'NYC'

假设主集合为foo,宗地集合为foo_parcel,客户数据集合为foo_cust。这是使用pipeline的{​​{1}}功能进行嵌套查询的方法:

$lookup
相关问题