Мангуст соединяется с группой, не работающей - PullRequest
0 голосов
/ 08 июля 2019

В моем 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)
    })

Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...