Я застрял в одной точке. Посмотрите на эту игровую площадку, она должна следовать этой логике c:
- , если коллекция истории пуста, вернуть данные
- , если коллекция дат истории больше, чем основа коллекции main на указанном
user_id
, ничего не возвращать - , если указано
user_id
не совпадает с датой сбора истории, тогда он должен вернуть все данные, которые находятся в основной коллекции.
Так что на детской площадке все выглядит хорошо единственная проблема, когда я помещаю 5e4e74eb380054797d9db623
id, он не должен возвращать мне данные, потому что его дата истекла, тогда как основная коллекция
db.main.aggregate([
{
$lookup: {
from: "history",
localField: "history_id",
foreignField: "history_id",
as: "History"
}
},
{
$unwind: {
path: "$History",
preserveNullAndEmptyArrays: true
}
},
{
$sort: {
_id: 1,
"History.history_id": 1,
"History.date": 1
}
},
{
$group: {
_id: "$_id",
data: {
$last: "$$ROOT"
},
History: {
$last: "$History"
}
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
"$data",
{
History: "$History"
}
]
}
}
},
{
"$match": {
$expr: {
$or: [
{
$eq: [
{
$type: "$History.date"
},
"missing"
]
},
{
$ne: [
"5e4e74eb380054797d9db623",
"$History.user_id"
]
},
{
$and: [
{
$eq: [
"5e4e74eb380054797d9db623",
"$History.user_id"
]
},
{
$gt: [
"$date",
"$History.date"
]
}
]
}
]
}
}
}
])
MongoPlayground