Пн go Агрегация с использованием $ Max - PullRequest
1 голос
/ 27 января 2020

У меня есть коллекция, в которой хранится история, т. Е. Новый документ создается каждый раз, когда в данные вносятся изменения, мне нужно извлекать поля на основе максимального значения поля даты, однако мой запрос продолжает возвращать либо все даты или требуют от меня, чтобы * sh поля в массив, что затрудняет анализ данных для конечного пользователя.

Ожидаемый вывод в виде CSV:

MAX(DATE), docID, url, type

1579719200216, 12371, www.foodnetwork.com, food
1579719200216, 12371, www.cnn.com, news,
1579719200216, 12371, www.wikipedia.com, info

Образец Do c:

{
  "document": {
    "revenueGroup": "fn",
    "metaDescription": "",
    "metaData": {
      "audit": {
        "lastModified": 1312414124,
        "clientId": ""
      },
      "entities": [],
      "docId": 1313943,
      "url": ""
    },
    "rootUrl": "",
    "taggedImages": {
      "totalSize": 1,
      "list": [
        {
          "image": {
            "objectId": "woman-reaching-for-basket",
            "caption": "",
            "url": "",
            "height": 3840,
            "width": 5760,
            "owner": "Facebook",
            "alt": "Woman reaching for basket"
          },
          "tags": {
            "totalSize": 4,
            "list": []
          }
        }
      ]
    },
    "title": "The 8 Best Food Items of 2020",
    "socialTitle": "The 8 Best Food Items of 2020",
    "primaryImage": {
      "objectId": "woman-reaching-for-basket.jpg",
      "caption": "",
      "url": "",
      "height": 3840,
      "width": 5760,
      "owner": "Hero Images / Getty Images",
      "alt": "Woman reaching for basket in laundry room"
    },
    "subheading": "Reduce your footprint with these top-performing diets",
    "citations": {
      "list": []
    },
    "docId": 1313943,
    "revisionId": "1313943_1579719200216",
    "templateType": "LIST",
    "documentState": {
      "activeDate": 579719200166,
      "state": "ACTIVE"
    }
  },
  "url": "",
  "items": {
    "totalSize": "",
    "list": [
      {
        "type": "recipe",
        "data": {
          "comInfo": {
            "list": [
              {
                "type": "food",
                "id": "https://www.foodnetwork.com"
              }
            ]
          },
          "type": ""
        },
        "id": 4,
        "uuid": "1313ida-qdad3-42c3-b41d-223q2eq2j"
      },
      {
        "type": "recipe",
        "data": {
          "comInfo": {
            "list": [
              {
                "type": "news",
                "id": "https://www.cnn.com"
              },
              {
                "type": "info",
                "id": "https://www.wikipedia.com"
              }
            ]
          },
          "type": "PRODUCT"
        },
        "id": 11,
        "uuid": "318231jc-da12-4475-8994-283u130d32"
      }
    ]
  },
  "vertical": "food"
}

Ниже запроса:

db.collection.aggregate([

    {
        $match: {
            vertical: "food",
            "document.documentState.state": "ACTIVE",
            "document.templateType": "LIST"

        }
    },
    {
        $unwind: "$document.items"
    },
    {
        $unwind: "$document.items.list"
    },
    {
        $unwind: "$document.items.list.contents"
    },
    {
        $unwind: "$document.items.list.contents.list"
    },
    {
        $match: {
            "document.items.list.contents.list.type": "recipe",
            "document.revenueGroup": "fn"
        }
    },
    {
        $sort: {
            "document.revisionId": -1
        }
    },
    {
        $group: {
            _id: {
                _id: {
                    docId: "$document.docId",
                    date: {$max: "$document.revisionId"}
                },
                url: "$document.items.list.contents.list.data.comInfo.list.id",
                type: "$document.items.list.contents.list.data.comInfo.list.type"
            }
        }
    },
    {
        $project: {
            _id: 1
        }
    },
    {
        $sort: {
            "document.items.list.contents.list.id": 1, "document.revisionId": -1
        }

    }
], {
    allowDiskUse: true
})

1 Ответ

0 голосов
/ 27 января 2020

Прежде всего, вам нужно go через документацию $group агрегации здесь .

, вы должны сделать это вместо этого:

{
$group: {
    "_id": "$document.docId"
    "date": {
        $max: "$document.revisionId"
    },
    "url": {
        $first: "$document.items.list.contents.list.data.comInfo.list.id"
    },
    "type": {
        $first:"$document.items.list.contents.list.data.comInfo.list.type"
    }
}
}

Это даст вам необходимый вывод.

...