Как я могу отфильтровать массив объектов в документе MongoDB

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #выразить #мангуст

Вопрос:

Я использую Express в качестве своего бэкэнда и MongoDB в качестве базы данных. Мои модели выглядят примерно так:

Pyments:

 var pymentSchema = new mongoose.Schema({
  name: {
    type: String,
    enum: [
        "VISA",
        "MASTERCARD",      
        "CASH",     
        ],
    required: [true, "Need a type of pyment"],
    },  
  total: {
    type: Number,
    default:0
    }, 
  });
 

Счет:

 var billingSchema = new mongoose.Schema({  
    pyments: {
        type: [Pyments],
        required: true,
        default:[]
        }});
 

Мои сохраненные данные выглядят следующим образом:

 "Bill": [
    {
        "_id": "5fe17af4a0f04d088ca24d36",
        "pyments": [
            {
                "total": 1.6,
                "name": "VISA"
            },
            {
                "total": 1.25,
                "name": "CASH"
            }
        ]
    },
    {
        "_id": "5fe8d6ede7adc919d4299d02",
        "pyments": [
            {
                "total": 1.61,
                "name": "VISA"
            },
            {
                "total": 1.00,
                "name": "MASTERCARD"
            },
            
        ]
    },
    {
        "_id": "5fea68a2eb0e382a50dae7a6",
        "pyments": [
            {
                "total": 2.5,
                "name": "VISA"
            },
            {
                "total": 3.38,
                "name": "MASTERCARD"
            }
        ]
    }]
 

Все, что я хочу, это получить, например, общее количество только в VISA , CASH и MASTERCARD вот так:
(Возвращенный объект)

 {        
    "Totals": [
        {
            "total": 5.71,
            "name": "VISA"
        },
        {
            "total": 1.25,
            "name": "CASH"
        },
        {
            "total": 4.38,
            "name": "MASTERCARD"
        }
    ]
}
 

Я действительно не знаю, что делать в этом случае, любая помощь будет оценена.

Ответ №1:

Вы можете использовать метод агрегации aggregate() и ниже этапы конвейера,

  • $unwind деконструировать pyments массив
  • $group по pyments.name и получить общую сумму pyment.total использования $sum
 BillSchemaModel.aggregate([
  { $unwind: "$pyments" },
  {
    $group: {
      _id: "$pyments.name",
      total: { $sum: "$pyments.total" }
    }
  }
])
 

Игровая площадка