#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 }
])