如何使用 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
}
我有一个集合 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
}