MongoDB, получая минимум и максимум подмножества массива - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь найти способ получить минимальное число orders между 2019-03-17 и 2019-03-19, исключая 2019-03-15 из результатов ..

{ 
"_id" : ObjectId("5c8ffdadde62bf097d54ec47"), 
"productId" : "32886845998", 
"orders" : [
    {
        "date" : ISODate("2019-03-15T00:00:00.000+0000"), 
        "orders" : NumberInt(9)
    }, 
    {
        "date" : ISODate("2019-03-17T00:00:00.000+0000"), 
        "orders" : NumberInt(21)
    }, 
    {
        "date" : ISODate("2019-03-18T00:00:00.000+0000"), 
        "orders" : NumberInt(20)
    }, 
    {
        "date" : ISODate("2019-03-19T00:00:00.000+0000"), 
        "orders" : NumberInt(30)
    }
]

}

Я пытался использовать операторы $min и $max, но это не помогло, потому что он перебрал весь массив, чтобы найти максимум и минимум

db.products.aggregate([
{
    $project: {
        maximum: {
            $reduce: {
                input: "$orders",
                initialValue: 0,
                in: {
                    $max: [
                        "$$value",
                        {
                            $cond: [
                                { $gte: [ "$$this.date", ISODate("2019-03-17T00:00:00.000+0000") ] },
                                "$$this.orders",
                                0
                            ]
                        }
                    ]
                }
            }
        }
    }
}

])

1 Ответ

1 голос
/ 22 марта 2019

Вы можете использовать $ filter , чтобы применить фильтрацию по orders.date, а затем вы можете применить $ min и $ max к отфильтрованному набору:

db.col.aggregate([
    {
        $project: {
            filteredOrders: {
                $filter: {
                    input: "$orders",
                    cond: {
                        $and: [
                            { $gte: [ "$$this.date", ISODate("2019-03-17T00:00:00.000+0000") ] },
                            { $lte: [ "$$this.date", ISODate("2019-03-19T00:00:00.000+0000") ] },
                        ]
                    }
                }
            }
        }
    },
    {
        $project: {
            min: { $min: "$filteredOrders.orders" },
            max: { $max: "$filteredOrders.orders" },
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...