This is Streak Collection and I want to search today date in streaks array if it exists then simply update the question count else create a new Object with the today date.
_id : {
type: mongoose.Types.ObjectId,
ref: "User",
},
streaks :[{
date :{
type : Date,
required : true
},
questionCount :{
type : Number,
required : true,
default : 0
}
}]
CodePudding user response:
Query
- check if day of
$$NOWdate is new - if new
$concatArraysto add the new date withcounter=1 - else
$mapto update just the counter of the found date
*$$NOW is a system variable that has the current date, if you don't want the current date you can put any date you like in "$$NOW" place
*$dateTrunc with unit=day keeps from the date only the part before day
(ignores time)
Examples are made for 20 November 2021 (change the data if you test them later)
Test code here(today exists)
Test code here(today doesn't exists)
update(
{"_id": {"$eq": 1}},
[{"$set":
{"new":
{"$eq":
[{"$filter":
{"input": "$streaks",
"cond":
{"$eq":
[{"$dateTrunc": {"date": "$$NOW", "unit": "day"}},
{"$dateTrunc": {"date": "$$this.date", "unit": "day"}}]}}},
[]]}}},
{"$set":
{"streaks":
{"$cond":
["$new",
{"$concatArrays":
["$streaks", [{"date": "$$NOW", "questionCount": 1}]]},
{"$map":
{"input": "$streaks",
"in":
{"$cond":
[{"$eq":
[{"$dateTrunc": {"date": "$$NOW", "unit": "day"}},
{"$dateTrunc": {"date": "$$this.date", "unit": "day"}}]},
{"$mergeObjects":
["$$this",
{"questionCount": {"$add": ["$$this.questionCount", 1]}}]},
"$$this"]}}}]}}}])
