是否有可能在mongodb上用多个条件进行聚合

问题描述 投票:0回答:1

我有一个价格集合,我想查询随时间变化的最大价格变化,这取决于卖方,我不知道如何在单个查询中完成此操作。

该收藏包括

_id
partNumber
seller
price
createdAt

每个产品每天大约插入30个价格,但在现实世界中并非100%...

所以我在考虑这个。

  1. 获取部件号和卖方日期<=(currentDate-比较范围天数)的第一个价格
  2. 获取部件号和卖方的最新价格
  3. 比较价格
  4. 按差异排序

mongodb聚合或其他方式可能吗?

mongodb mongoose aggregate
1个回答
1
投票

假设我们有两个卖方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
}
© www.soinside.com 2019 - 2024. All rights reserved.