Hello I have the following collections
const TransactionSchema = mongoose.Schema({
schedule: {
type: mongoose.Schema.ObjectId,
required: true,
ref: "Schedule"
},
uniqueCode: {
type: String,
required: true
},
created: {
type: Date,
default: Date.now
},
status: {
type: String,
required: false
},
})
const ScheduleSchema = mongoose.Schema({
start: {
type: Date,
required: true,
},
end: {
type: Date,
required: false,
},
questions: {
type: Array,
default: [],
},
items: [{
item: {
type: mongoose.Schema.ObjectId,
require: true,
ref: "Item"
},
stok: {
type: Number,
required: true
}
}],
status: {
type: String,
required: false
},
})
and I want to return how many times the schedule appear in transaction and reduce it with the number of total item I have in array of objects items in schedule collection. For example I have the following data.
transaction
[
{
"_id":"identifier",
"schedule":identifier1,
"uniqueCode":"312312312312",
"created":"Date"
},
{
"_id":"identifier",
"schedule":identifier1,
"uniqueCode":"1213123123",
"created":"Date"
}
]
schedule
[
{
"_id":identifier1,
"start":"date",
"end":"date",
"questions":[
12,
32,
122
],
"items":[
{
"item":itemIdentifier1,
"stock":120
},
{
"item":itemIndentifier2,
"stock":1000
}
],
"status":"Active"
},
{
"_id":identifier2,
"start":"date",
"end":"date",
"questions":[
12,
32,
122
],
"items":[
{
"item":itemIdentifier1,
"stock":120
}
],
"status":"Active"
}
]
and I want to get the following result:
[
{
"schedule":identifier1,
"total":1118
},
{
"schedule":identifier2,
"total":120
}
]
note: the first row shows 1118 from total stock of item 1120 - 2 which is how many times the schedule appeared in transaction. The second row shows 120 because the schedule hasn't appeared in transaction.
thank you. Sorry for my bad english.
CodePudding user response:
$lookup
- Joinschedule
collection (_id
) withtransaction
collection (schedule
) to gettransactions
array.$project
- Decorate output documents. Fortotal
field,$subtract
for$sum
ofitems.stock
and$size
oftransactions
array.
db.schedule.aggregate([
{
"$lookup": {
"from": "transaction",
"localField": "_id",
"foreignField": "schedule",
"as": "transactions"
}
},
{
$project: {
schedule: "$_id",
total: {
$subtract: [
{
$sum: "$items.stock"
},
{
$size: "$transactions"
}
]
}
}
}
])