MongoDB使用聚合过滤掉某些数组元素并返回一个对象

MongoDB filter out certain array elements using aggregation and return an object

提问人:fanbondi 提问时间:8/9/2023 最后编辑:kenmistryfanbondi 更新时间:10/24/2023 访问量:22

问:

我在下面有MongoDB中的数据结构表示一个订单。

order_id: 1
customer name: Peter
items: [{id:1, name: Laptop, shop_id: 10, id:2, name: Router, shop_id: 2}]
customer:{key:val, key2:val2}
date: 21-04-2023
isDeleted: False

我有两个界面,一个用于管理员,一个用于店主。在我的管理面板上,我想在不过滤的情况下显示所有订购的项目。下面的代码给了我:

Parse.Cloud.define('getOrderWithUser', async (req) => {

const { master, params, user, } = req

  const query = new Parse.Query('Order')

  query.include('customer')
  query.include('items')
  query.notEqualTo('isDeleted', true)

  return query.get(params.id, { useMasterKey: true })

})

但是,对于我需要过滤掉商品内容的店主,例如仅 shop_id = 10。我使用聚合管道和函数,如下面的代码所示。unwind

Parse.Cloud.define('getOrderWithUser', async (req) => {
  var pipeline = [
    {match: {
      objectId: {$eq: params.id},
      isDeleted: {$ne: true}
    }},        
  {unwind: "$items"},        
   {
     match: {'items.shop_id': 10}}
   }, 
   {group:{
     objectId: params.id, 
     data: { $first : "$$ROOT" },
     items: {$push : "$items"}
   }
   },
   { replaceRoot: { newRoot: "$data" }}
  ]
  const query = new Parse.Query('Order')
  query.include('customer')
  query.include('items')
  return query.aggregate(pipeline, { useMasterKey: true })

})

问题是,聚合方法不起作用,它返回一个对象数组 [{}] 而不仅仅是一个对象 {}。也许我没有正确地解决这个问题,我想要的只是根据用户类型(管理员或店主)在数组中过滤掉。items

node.js mongoDB 解析服务器

评论


答: 暂无答案