猫鼬聚集与小组不工作

时间:2019-07-08 12:47:25

标签: node.js mongodb mongoose mongodb-query aggregation-framework

在我的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分组-带有猫鼬的所有东西   聚集。

所以,我认为我需要两个分组:第一个分组是 menuId ,第二个分组是 itemId

此外,我想知道每个项目中有多少未准备好-因此,在按menuId分组后,我需要统计所有未准备的项目

预期输出:

我想到了这样的东西:

{
   "result":[
      {
         "menuID":"tastefulMenu123",
         "items":[
            {
               "itemId":"noodlesoop123",
               "unpreparedCount":13
            },
            {
               "itemId":"tastyBurger123",
               "unpreparedCount":2
            },
            {
               "itemId":"icecoldIce123",
               "unpreparedCount":20
            }
         ]
      }
   ]
}

将有一系列子文档,每个menuId都有一个子文档。然后,每个子文档都有一个包含项目ID和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)
    })

任何帮助将不胜感激!

0 个答案:

没有答案