如何使用 MongoDb 中投影字段的结果进行减法运算

How to make subtract operation using result of projected Field in MongoDb

我有一个集合 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 ** 字段之间进行 $subtract 操作,就像这样,但它 returns 为空。

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
}

您应该在项目范围之外使用 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
}