неправильный подсчет с $ filter - PullRequest
0 голосов
/ 29 мая 2020

Моя конфигурация базы данных выглядит так:

{
    "_id" : ObjectId("5ece47aa6510a611b47aac5a"),
    "boats" : [ 
        {
            "_id" : ObjectId("5ece47aa6510a611b47aac6e"),
            "model" : "Dufour",
            "year" : 2019,
            "about" : [ 
                {
                    "_id" : ObjectId("5ece47aa6510a611b47aac71"),
                    "Capacity" : 14,
                    "characteristics" : [ 
                        {
                            "_id" : ObjectId("5ece47aa6510a611b47aac73"),
                            "fuel" : "petrol",
                             "fuelCap" : 200
                        }, 
                        {
                            "_id" : ObjectId("5ece47aa6510a611b47aac73"),
                            "fuel" : "petrol",
                            "fuelCap" : 120
                        },
                    ]
                }, 
                {
                    "_id" : ObjectId("5ece47aa6510a611b47aac71"),
                    "Capacity" : 8,
                    "characteristics" : [ 
                        {
                            "_id" : ObjectId("5ece47aa6510a611b47aac73"),
                            "fuel" : "benzin",
                             "fuelCap" : 180
                        }, 
                        {
                            "_id" : ObjectId("5ece47aa6510a611b47aac73"),
                            "fuel" : "petrol",
                            "fuelCap" : 100
                        },
                    ]
                },
              {...},
              {...},
           ]
    }

Теперь я пытаюсь подсчитать количество лодок, у которых есть "топливо": "бензин", поэтому я использую следующий код:

router.get('/boat', async(req, res)=>{
    try{
        const fuelData = await Boat.aggregate([
            {
            $project: {
                fuelData: {
                     $filter: {
                        input: "$boats",
                        as: "boats",
                       cond: {
                            $filter:{
                                input:"$$boats.about",
                                as:"about",
                                cond:{
                                    $filter:{
                                        input:"$$about.characteristics",
                                        as:"characteristics",
                                        cond:{
                                            $eq:["$$activity1.activity.type", "STILL"]
                                        }
                                    }

                                }   
                            }
                        }

                    }
                }
            }
            },
            {
               $project: {
                  boatsCount: {$size : "$fuelData" } 
               }
            }
        ])
        res.status(201).send(fuelData)
    }catch(e){
        res.send(e)
    }

})

Проблема в том, что вернули неверное число boatCount. И похоже, что он возвращает количество лодок, которые находятся внутри db. Любая помощь, как правильно посчитать лодки, у которых есть «топливо»: «бензин»? Что-то не так в моем коде?

1 Ответ

0 голосов
/ 29 мая 2020

https://mongoplayground.net/p/D0FEhTMJEJ1

Надеюсь, это то, что вам нужно. В предоставленных вами примерах данных отсутствует символ] &}.

Поэтому я добавил 1 дополнительную лодку с 2 примерно.

db.collection.aggregate([
  {
    $match: {
      "boats.about.characteristics.fuel": "petrol"
    }
  },
  {
    $unwind: "$boats"
  },
  {
    $unwind: "$boats.about"
  },
  {
    $match: {
      "boats.about.characteristics.fuel": "petrol"
    }
  },
  {
    $group: {
      _id: null,
      count: {
        $sum: 1
      }
    }
  }
])
...