Можно ли объединить с несколькими условиями на mongodb - PullRequest
0 голосов
/ 18 октября 2019

У меня есть коллекция цен, и я хочу запросить самое большое изменение цены с течением времени в зависимости от продавца, и я не знаю, как это сделать в одном запросе.

Коллекция включает

_id
partNumber
seller
price
createdAt

Каждый день для каждого продукта должно быть вставлено около 30 цен, но в реальном мире это не на 100% ...

, поэтому я думал об этом.

  1. получить первую цену, где date <= (currentDate - сравнить дни диапазона) для partNumber и продавца </li>
  2. получить новейшую цену для partNumber и продавца
  3. , отличающиеся от цен
  4. сортировать по разности

Возможно ли это с помощью агрегата mongodb или чего-то еще?

1 Ответ

1 голос
/ 18 октября 2019

Предположим, у нас есть 2 продавца A и B. Мы взяли набор данных, как показано ниже (при условии, что номер детали совпадает или вы также можете изменить его):

/* 1 createdAt:18/10/2019, 16:48:35*/
{
    "_id" : ObjectId("5da99f8bd4ce6a7d8bebb442"),
    "partNumber" : 1,
    "seller" : "B",
    "price" : 15,
    "createdAt" : ISODate("2019-10-11T16:13:31.451+05:30")
},

/* 2 createdAt:18/10/2019, 16:48:35*/
{
    "_id" : ObjectId("5da99f8bd4ce6a7d8bebb441"),
    "partNumber" : 1,
    "seller" : "A",
    "price" : 1,
    "createdAt" : ISODate("2019-10-11T16:13:31.451+05:30")
},

/* 3 createdAt:18/10/2019, 16:48:35*/
{
    "_id" : ObjectId("5da99f8bd4ce6a7d8bebb440"),
    "partNumber" : 1,
    "seller" : "B",
    "price" : 10,
    "createdAt" : ISODate("2019-10-10T16:13:31.451+05:30")
},

/* 4 createdAt:18/10/2019, 16:48:35*/
{
    "_id" : ObjectId("5da99f8bd4ce6a7d8bebb43f"),
    "partNumber" : 1,
    "seller" : "A",
    "price" : 10,
    "createdAt" : ISODate("2019-10-10T16:13:31.451+05:30")
},

/* 5 createdAt:18/10/2019, 16:48:35*/
{
    "_id" : ObjectId("5da99f8bd4ce6a7d8bebb43e"),
    "partNumber" : 1,
    "seller" : "B",
    "price" : 7,
    "createdAt" : ISODate("2019-10-09T16:13:31.451+05:30")
},

/* 6 createdAt:18/10/2019, 16:48:35*/
{
    "_id" : ObjectId("5da99f8bd4ce6a7d8bebb43d"),
    "partNumber" : 1,
    "seller" : "A",
    "price" : 5,
    "createdAt" : ISODate("2019-10-09T16:13:31.451+05:30")
}

Наш запрос будеткак показано ниже:

db.collection.aggregate([
    {
        $group: {
            _id: { seller: "$seller", partNumber: "$partNumber" },
            lastSalesPrice: { $last: "$price" },
            firstSalesPrice: { $first: "$price" },
        }
    },
    {
        $project: {
            seller: "$_id.seller",
            partNumber: "$_id.partNumber",
            lastSalesPrice: "$lastSalesPrice",
            firstSalesPrice: "$firstSalesPrice",
            diff: { $subtract: ["$lastSalesPrice", "$firstSalesPrice" ] }
        }
    },
    {
        $sort: { "diff": -1 }
    }
]) 

Результат запроса выше будет следующим:

/* 1 */
{
    "_id" : {
        "seller" : "B",
        "partNumber" : 1
    },
    "seller" : "B",
    "partNumber" : 1,
    "lastSalesPrice" : 15,
    "firstSalesPrice" : 7,
    "diff" : 8
},

/* 2 */
{
    "_id" : {
        "seller" : "A",
        "partNumber" : 1
    },
    "seller" : "A",
    "partNumber" : 1,
    "lastSalesPrice" : 1,
    "firstSalesPrice" : 5,
    "diff" : -4
}
...