MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Agregacja GroupBy, w tym brakujące daty w mongo

Może mieszek jest tym, czego chcesz.

1)Utwórz jedną kolekcję z licznikiem, na przykład tutaj 1-10 na 10 dni

  [
  {
    "date": 0
  },
  {
    "date": 1
  },
  {
    "date": 2
  },
  {
    "date": 3
  },
  {
    "date": 4
  },
  {
    "date": 5
  },
  {
    "date": 6
  },
  {
    "date": 7
  },
  {
    "date": 8
  },
  {
    "date": 9
  }
  ]
  1. Zaktualizuj tę kolekcję i utwórz dane, 10 dat za pomocą $addHere zaczynamy od daty „2021-08-01T00:00:00+00:00” i kończymy datę „2021-08-10T00:00:00” +00:00"

Ta aktualizacja to zrobi(q=filtr,u=aktualizacja,tutaj jej aktualizacja potoku)

{
  "update": "dates",
  "updates": [
    {
      "q": {},
      "u": [
        {
          "$addFields": {
            "date": {
              "$add": [
                "2021-08-01T00:00:00Z",
                {
                  "$multiply": [
                    "$date",
                    24,
                    60,
                    60000
                  ]
                }
              ]
            }
          }
        }
      ],
      "multi": true
    }
  ]
}

Wyniki w (10 dat, 1 dzień różnicy)

{
  "_id": {
    "$oid": "610c4bf99ccb15d9c9d67b55"
  },
  "date": {
    "$date": "2021-08-01T00:00:00Z"
  }
},{
  "_id": {
    "$oid": "610c4bf99ccb15d9c9d67b56"
  },
  "date": {
    "$date": "2021-08-02T00:00:00Z"
  }
},{
  "_id": {
    "$oid": "610c4bf99ccb15d9c9d67b57"
  },
  "date": {
    "$date": "2021-08-03T00:00:00Z"
  }
}
...

3)Teraz mamy zbiór dat z 10 datami, wszystkie z jednodniową różnicą dokonamy przeglądu odbioru zamówień

Odbiór zamówień

[
  {
    "_id": 1,
    "date": "2021-08-01T00:00:00Z"
  },
  {
    "_id": 2,
    "date": "2021-08-01T00:00:00Z"
  },
  {
    "_id": 3,
    "date": "2021-08-05T00:00:00Z"
  },
  {
    "_id": 4,
    "date": "2021-08-03T00:00:00Z"
  }
]

Zapytanie(weź potok, najpierw przefiltruj żądane daty, a następnie dołącz tylko wtedy, gdy zamówienie zostanie złożone tego samego dnia)

{
  "aggregate": "dates",
  "pipeline": [
    {
      "$match": {
        "$expr": {
          "$and": [
            {
              "$gte": [
                "$date",
                {
                  "$dateFromString": {
                    "dateString": "2021-08-01T00:00:00"
                  }
                }
              ]
            },
            {
              "$lte": [
                "$date",
                {
                  "$dateFromString": {
                    "dateString": "2021-08-05T00:00:00"
                  }
                }
              ]
            }
          ]
        }
      }
    },
    {
      "$lookup": {
        "from": "orders",
        "let": {
          "datesDate": "$date"
        },
        "pipeline": [
          {
            "$match": {
              "$expr": {
                "$eq": [
                  {
                    "$dateToString": {
                      "format": "%Y-%m-%d",
                      "date": "$$datesDate"
                    }
                  },
                  {
                    "$dateToString": {
                      "format": "%Y-%m-%d",
                      "date": "$date"
                    }
                  }
                ]
              }
            }
          }
        ],
        "as": "found-orders"
      }
    },
    {
      "$project": {
        "_id": 0
      }
    }
  ],
  "cursor": {},
  "maxTimeMS": 1200000
}

Wyniki

[
  {
    "date": "2021-08-01T00:00:00Z",
    "found-orders": [
      {
        "_id": 1,
        "date": "2021-08-01T00:00:00Z"
      },
      {
        "_id": 2,
        "date": "2021-08-01T00:00:00Z"
      }
    ]
  },
  {
    "date": "2021-08-02T00:00:00Z",
    "found-orders": []
  },
  {
    "date": "2021-08-03T00:00:00Z",
    "found-orders": [
      {
        "_id": 4,
        "date": "2021-08-03T00:00:00Z"
      }
    ]
  },
  {
    "date": "2021-08-04T00:00:00Z",
    "found-orders": []
  },
  {
    "date": "2021-08-05T00:00:00Z",
    "found-orders": [
      {
        "_id": 3,
        "date": "2021-08-05T00:00:00Z"
      }
    ]
  }
]

Daje to dla każdej daty (dla każdego dnia) zamówienia, które zostały złożone w tym dniu.Jeśli w jednej dacie nie dokonano żadnych zamówień, tablica jest pusta.Tutaj jest tylko 10 dni, możesz wykonać zbieranie dat z 5 lat w zależności od potrzeb.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb $w przeciw polu obiektów tablicy zamiast obiektów tablicy

  2. Czy mongodump blokuje bazę danych?

  3. Jak wykonać zapytanie z ustawieniami strefy czasowej w Mongodb

  4. Liczba Mongodb vs findone

  5. Błąd przekroczenia limitu czasu połączenia mongodb