Как получить 2-й по величине статус в mongodb с коллекцией, имеющей несколько статусов

#mongodb #aggregation-framework #query-optimization

#mongodb #структура агрегации #оптимизация запросов

Вопрос:

     /* 1 */
    {
        "_id" : ObjectId("5f0b6699486ea60a2a9c62fh"),
        "EventDatetime" : "2020-07-12T19:38:00.653",
        "Eventstatus" : "05",
        "DelNumber" : "0703676929",
        "DELIVERY_ITEM" : [ 
            {
                "Product_Code" : "123",
                "Product_Name" : "utensils",
                "Shipment_Quantity" : "12",
            }, 
            {
                "Product_Code" : "456",
                "Product_Name" : "clothes",
                "Shipment_Quantity" : "10",
            }
        ]
    }
    {
        "_id" : ObjectId("5f0b6699486ea60a2a9c62fi"),
        "EventDatetime" : "2020-07-12T19:38:00.653",
        "Eventstatus" : "03",
        "DelNumber" : "0703676929",,
        "DELIVERY_ITEM" : [ 
            {
                "Product_Code" : "123",
                "Product_Name" : "utensils",
                "Shipment_Quantity" : "12",
            }, 
            {
                "Product_Code" : "456",
                "Product_Name" : "clothes",
                "Shipment_Quantity" : "10",
            }
        ]
    }
    {
        "_id" : ObjectId("5f0b6699486ea60a2a9c62fg"),
        "EventDatetime" : "2020-07-12T19:38:00.653",
        "Eventstatus" : "02",
        "DelNumber" : "0703676929",
        "DELIVERY_ITEM" : [ 
            {
                "Product_Code" : "123",
                "Product_Name" : "utensils",
                "Shipment_Quantity" : "12",
            }, 
            {
                "Product_Code" : "456",
                "Product_Name" : "clothes",
                "Shipment_Quantity" : "10",
            }
        ]
    }
    /*2*/

    {
        "_id" : ObjectId("5f0b6699486ea60a2a9c62fa"),
        "EventDatetime" : "2020-07-12T19:38:00.653",
        "Eventstatus" : "04",
        "DelNumber" : "0703676928",
        "DELIVERY_ITEM" : [ 
            {
                "Product_Code" : "123",
                "Product_Name" : "utensils",
                "Shipment_Quantity" : "12",
            }, 
            {
                "Product_Code" : "456",
                "Product_Name" : "clothes",
                "Shipment_Quantity" : "10",
            }
        ]
    }
    {
        "_id" : ObjectId("5f0b6699486ea60a2a9c62fb"),
        "EventDatetime" : "2020-07-12T19:38:00.653",
        "Eventstatus" : "02",
        "DelNumber" : "0703676928",
        "DELIVERY_ITEM" : [ 
            {
                "Product_Code" : "123",
                "Product_Name" : "utensils",
                "Shipment_Quantity" : "12",
            }, 
            {
                "Product_Code" : "456",
                "Product_Name" : "clothes",
                "Shipment_Quantity" : "10",
            }
        ]
    }
    {
        "_id" : ObjectId("5f0b6699486ea60a2a9c62fc"),
        "EventDatetime" : "2020-07-12T19:38:00.653",
        "Eventstatus" : "01",
        "DelNumber" : "0703676928",
        "DELIVERY_ITEM" : [ 
            {
                "Product_Code" : "123",
                "Product_Name" : "utensils",
                "Shipment_Quantity" : "12",
            }, 
            {
                "Product_Code" : "456",
                "Product_Name" : "clothes",
                "Shipment_Quantity" : "10",
            }
        ]
    }
  

У меня есть коллекция для заказов. Рассматривайте это как сайт электронной коммерции. Теперь заказ может иметь несколько статусов 00,01,02,03,04 и 05 . 05 относится к отслеживанию заказа в реальном времени. Итак, мой delno.1 может иметь статус 01,02,05,05,03,05,05. Моя проблема в том, как я могу получить запрос, который я запускаю, дает 03 в качестве последнего статуса, а не 05.
Также, когда статус достигает 04, эта запись мне не нужна для извлечения.
Любая помощь будет отличной!!

Комментарии:

1. Можете ли вы добавить свою запись заказа в вопрос?

2. $ push с помощью $ slice (2) после упорядочивания документов.

Ответ №1:

Сначала вы должны удалить все документы, имеющие статус 04. Затем выполните поиск в той же коллекции, чтобы получить оставшиеся документы. Размотайте его и отфильтруйте документы со статусом 05.

 [
  {
    //Group records by DelNumber
    $group: {
      _id: '$DelNumber',
      EventStatuses: {
        $addToSet: '$Eventstatus'
      }
    }
  }, {
    // Remove any with status 04
    $match: {
      EventStatuses: {
        $ne: '04'
      }
    }
  }, {
    // Looksup on same collection to get full document
    $lookup: {
      from: 'collection',
      localField: '_id',
      foreignField: 'DelNumber',
      as: 'matched'
    }
  }, {
    // Unwind the matched records
    $unwind: {
      path: '$matched'
    }
  }, {
    $replaceRoot: {
      newRoot: '$matched'
    }
  }, {
    // Remove any record with status 05
    $match: {
      Eventstatus: {
        $ne: '05'
      }
    }
  }
]
  

Ответ №2:

Вы можете попробовать,

  • $match ваши условия, DelNumber равен «0703676929», а Eventstatus не равен 4-му
  • $addFields чтобы добавить Eventstatus в целочисленное поле, используя $toInt
  • $sort по полю статуса в порядке убывания
  • $skip на второй странице (1), потому что первый статус 5
  • $limit одна запись
 db.collection.aggregate([
  { 
    $match: { 
      DelNumber: "0703676929",
      Eventstatus: { $ne: "04" } 
    } 
  }, 
  { $addFields: { status: { $toInt: "$Eventstatus" } } },
  { $sort: { status: -1 } },
  { $skip: 1 },
  { $limit: 1 }
])
  

Игровая площадка


Второй способ, которым вы можете использовать условие исправления в 5-м статусе,

  • $match ваши условия, DelNumber равен «0703676929», а Eventstatus не равен 4-му и 5-му
  • $addFields чтобы добавить Eventstatus в целочисленное поле, используя $toInt
  • $sort по полю статуса в порядке убывания
  • $limit одна запись
 db.collection.aggregate([
  {
    $match: {
      DelNumber: "0703676929",
      Eventstatus: { $nin: ["05", "04"] }
    }
  },
  { $addFields: { status: { $toInt: "$Eventstatus" } } },
  { $sort: { status: -1 } },
  { $limit: 1 }
])
  

Игровая площадка