В моем Node.JS API можно заказать и получить меню.Структура упорядоченного меню выглядит следующим образом (основная схема - это orderMenuSchema ; menuItemSchema - для массива поддокументов с упорядоченными элементами):
var menuItemSchema = mongoose.Schema({
itemId: {
type: mongoose.Schema.Types.ObjectId,
required: true
},
prepared: {
type: Boolean,
default: false
},
finished: {
type: Boolean,
default: false
},
timestamp: {
type: Date,
default: Date()
}
}, {_id: false})
var orderMenuSchema = mongoose.Schema({
orderId: {
type: mongoose.Schema.Types.ObjectId,
required: true
},
menuId: {
type: mongoose.Schema.Types.ObjectId,
required: true
},
items: {
type: [menuItemSchema],
required: true,
validate: menuItemsCheck
},
finished: {
type: Boolean,
default: false
},
timestamp: {
type: Date,
default: Date()
}
})
Пример данных:
{
"_id":"5d2333a1841a0e4ef05873d0",
"finished":false,
"timestamp":"2019-07-08T12:14:04.000Z",
"menuId":"5d189ffdbe02ef0b00b22370",
"items":[
{
"prepared":false,
"finished":false,
"timestamp":"2019-07-08T12:14:04.000Z",
"itemId":"5d189ffdbe02ef0b00b2236d"
},
{
"prepared":false,
"finished":false,
"timestamp":"2019-07-08T12:14:04.000Z",
"itemId":"5d189ffdbe02ef0b00b2236e"
},
{
"prepared":false,
"finished":false,
"timestamp":"2019-07-08T12:14:04.000Z",
"itemId":"5d189ffdbe02ef0b00b2236f"
}
],
"orderId":"5d2333a1841a0e4ef05873c3",
"__v":0
}
Информация о том, подготовлен элемент или нет, сохраняется в подготовленном поле menuItem.
Каждое менюимеет несколько элементов на выбор, и пользователь может иметь только некоторые элементы - поэтому в orderMenuSchema имеется массив вложенных документов, называемых «элементы», в которых хранятся только упорядоченные элементы .
Теперь я хотел бы получить все неподготовленные меню, сгруппировать их по menuID, а затем сгруппировать их по itemID - все с агрегацией Mongoose.
Итак, мне нужно двагруппировки: первая по menuId , вторая по itemId .
Кроме того, я хотел бы знать, сколько из каждого элемента не подготовлено - такпосле группировки по менюd, Мне нужно получить количество всех неподготовленных предметов
Ожидаемый результат:
Я подумал примерно так:
{
"result":[
{
"menuID":"tastefulMenu123",
"items":[
{
"itemId":"noodlesoop123",
"unpreparedCount":13
},
{
"itemId":"tastyBurger123",
"unpreparedCount":2
},
{
"itemId":"icecoldIce123",
"unpreparedCount":20
}
]
}
]
}
Тамбудет массив вложенных документов, один вложенный документ для каждого menuId.Каждый вложенный документ содержит массив элементов, в котором хранятся itemID и unpreparedCount.
То, что я уже пробовал (не работает):
OrderMenu.aggregate([
{$unwind: "$items"},
{ $project: { prepared: 1, itemId: 1} },
{ $match: {
prepared: false,
timestamp: {
$gte: today,
$lt: tomorrow
}
}},
{ $group: {
_id: {menuId: '$menuId', itemId: '$itemId'},
count: { $sum: 1 }
}}
]).then(result => {
console.log(result)
return Promise.resolve(result)
}).catch(error => {
console.log(error)
return Promise.reject(500)
})
Любая помощь приветствуется!