Mongodb Mongoose-在子文档数组中查找一个项以及该数组中的全部项

Mongodb Mongoose-在子文档数组中查找一个项以及该数组中的全部项,mongodb,express,mongoose,aggregation-framework,Mongodb,Express,Mongoose,Aggregation Framework,我有一个商店收藏,里面有这样一个文档: { _id:'xyz' sales:[ { _id:'aaa' productId:'ppp', quantity: 3 }, { _id:'bbb' productId:'qqq' quantity: 4 }, ] } 当我查询sales数组中的一个元素时_id:'aaa',我需要得到它的数量和整个sales数组中的数量之和 即数量:3, 总数:

我有一个商店收藏,里面有这样一个文档:

{
  _id:'xyz'
  sales:[
    {
      _id:'aaa'
      productId:'ppp',
      quantity: 3
    },
    {
     _id:'bbb'
     productId:'qqq'
     quantity: 4
   },
  ]
}
当我查询sales数组中的一个元素时_id:'aaa',我需要得到它的数量和整个sales数组中的数量之和 即数量:3, 总数:7

同样,当我查询另一个元素_id:'bbb'时,我需要得到数量:4,总数量:7

我已尝试使用聚合,如下所示:

Shop.aggregate([
        {$match: {'_id': ObjectId('xyz'),'sales._id':ObjectId('aaa')}},
        {$group: {
          _id: "$_id",
          totalQuantity: {
            "$sum": {
              "$sum": "$sales.quantity"
            }
          }
        }
 ])
但这不起作用


我怎样才能做到这一点呢?

我们可以使用

我们可以使用查找所需项目,并访问数量

db.collection.aggregate[ { $match:{ _id:xyz } }, { $项目:{ 总数量:{ $sum:$sales.quantity }, 数量:{ $filter:{ 输入:$sales, 条件:{ $eq:[ $$this.\u id, aaa ] } } } } }, { $addFields:{ 数量:{ $sum:$quantity.quantity } } } ] 这将给出aaa值的以下结果:

[
  {
    "_id": "xyz",
    "quantity": 3,
    "totalQuantity": 7
  }
]
对于未找到的值,数量将为0:

[
  {
    "_id": "xyz",
    "quantity": 0,
    "totalQuantity": 7
  }
]

您可以使用另一个字段名的第一个数量字段是项目阶段中筛选的结果,筛选返回一个数组。因此,我使用addFields覆盖该数量字段,其值为$sum:$quantity.quantity。看看这个剧本,我去掉了最后一个舞台,这样你才能更好地理解@Amani最好问一个新问题。如果这个问题解决了你原来的问题,你能把它标记为答案吗?在一个问题中混合另一个问题不是一个好主意。@sulaymanSah好的。。。我现在把它作为一个新问题来问。我已经接受了你的回答。真的吗works@Amani等等,看起来很简单,我会尽力帮你,请等等。@Amani我想这解决了你的新问题: