Как сделать операцию вычитания, используя результат спроецированного поля в MongoDb - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть коллекция myCollection с массивом членов и количеством мест:

{
   name : String,
   members: [{status : Number, memberId : {type: Schema.Types.ObjectId, ref: 'members'}],
   nbPlaces : Number
}

, и у меня есть эти данные

"_id" : ObjectId("5e83791eb49ab07a48e0282b")
   "members" : [ 
        {
            "status" : 1,
            "_id" : ObjectId("5e83791eb49ab07a48e0282c"),
            "memberId" : ObjectId("5e7dbf5b257e6b18a62f2da9")
        }, 
        {
            "status" : 2,
            "_id" : ObjectId("5e837944b49ab07a48e0282d"),
            "memberId" : ObjectId("5e7de2dbe027f43adf678db8")
        }
    ],
  "nbPlaces": 5

Я хочу сделать операция $ вычитает между проецируемым полем и ** nbPlaces ** полем, как это, но возвращает ноль.

db.getCollection('events').aggregate([
    {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},

         {   $project: {
              nbMembers: {
                    "$size":{
                        $filter: {
                            input: "$members",
                            as: "member",
                            cond: {$eq: ["$$member.status", 1]}
                        }
                    }
                },

                 "nbPlaces": 1,
                 "freePlaces": {$subtract : ["$nbPlaces", "$nbMembers"]}
            }

        }

    ])

Как я могу это сделать, спасибо

Результат

{
    "_id" : ObjectId("5e83791eb49ab07a48e0282b"),
    "nbPlaces" : 5,
    "nbMembers" : 1,
    "freePlaces" : null
}

1 Ответ

0 голосов
/ 03 апреля 2020

Вы должны использовать переменную nbMembers вне области проекта. Потому что он еще не рассчитан в рамках проекта.

db.getCollection('events').aggregate([
    {$match: {_id: ObjectId("5e83791eb49ab07a48e0282b")}},
    {$project: {
        nbMembers: {
            "$size":{
                $filter: {
                    input: "$members",
                    as: "member",
                    cond: {$eq: ["$$member.status", 1]}
                    }
                 }
              },
                "nbPlaces": 1
            }
        },
     { $addFields: { "freePlaces": {$subtract : ["$nbPlaces", "$nbMembers"] } } }
 ])

Результат:

{
    "_id" : ObjectId("5e83791eb49ab07a48e0282b"),
    "nbPlaces" : 5.0,
    "nbMembers" : 1,
    "freePlaces" : 4.0
}
...