获取最近 X 天的记录
Get records of the last X days
下面的代码 return 向我提供了存在于 CollectionA 但不存在于 CollectionB 中的所有数据。 (使用 mainID
作为参考)。
return this.aggregate([
{
$lookup: {
from: 'CollectionB',
localField: 'mainId',
foreignField: 'mainId',
as: 'validd',
},
},
{
$match: {
'validd.mainId': { $exists: false },
},
},
]);
但现在我需要添加另一个 过滤器。我还需要获取字段 createdAt
大于 90 天的数据。
换句话说:生命周期超过 90 天的记录。
尝试在 $match
中使用 $gte
和 $lte
但没有成功。
{
$match: {
'validd.createdAt': { $gte: moment.utc().add(-90, "days") },
},
},
这个return没什么。
我的数据库:
{
_id: 227dd33c5c51c79f63743da3
mainId: 5c306562-9c87-48dd-93ca-4a118be50490
createdAt: 2022-05-07T02:28:12.537+00:00
},
{
_id: f3ddd33c5c51c79f63743da3
mainId: 5c306562-9c87-48dd-93ca-4a118be50490
createdAt: 2022-05-10T02:28:12.537+00:00
},
{
_id: 227dd33c5c51c79f63743da3
mainId: 5c306562-9c87-48dd-93ca-4a118be50490
createdAt: 2022-01-01T02:28:12.537+00:00
}
我们可以忽略所有数据,只需要关注createdAt
。
我想保留 $lookup 逻辑,但也将过滤器添加到 return 只有 createdAt
大于 90 天的行(考虑当天/今天) .
所以按照这个逻辑,只有 last 记录应该被 returned,因为所有其他行都是在 内创建的90 天前
编辑
澄清一下。我需要 return 数据如果:
- collectionA 的行在 collectionB 中不存在
- 集合 B 中存在集合 A 的行 但是
createdAt
超过 X 天。
根据@ray
的回答试过了
return this.aggregate([
{
$lookup: {
from: 'CollectionB',
localField: 'mainId',
foreignField: 'mainId',
as: 'validd',
},
},
{
$match: {
$expr: {
$or: [
{
$eq: ["$validd", []]
},
{
$and: [
{
$lt: [ "validd.createdAt", moment.utc().add(-interval, "days").format('YYYY-MM-DD') ]
},
{
$ne: ["validd", null]
}
]
}
]
}
},
},
]);
您可以在 $match
中的 $expr
中简单地使用 $or
db.CollectionA.aggregate([
{
"$lookup": {
"from": "CollectionB",
"localField": "mainId",
"foreignField": "mainId",
"as": "validd"
}
},
{
"$match": {
$expr: {
$or: [
{
$eq: [
"$validd",
[]
]
},
{
$and: [
{
$ne: [
"$validd",
[]
]
},
{
$lt: [
"$createdAt",
{
"$dateSubtract": {
"startDate": "$$NOW",
"unit": "day",
"amount": 90
}
}
]
}
]
}
]
}
}
}
])
这里是Mongo playground供您参考。
对于MongoDB v5.0 之前的版本,您可以$subtract
$$NOW
90 天* 24 小时* 60 分钟* 60 秒* 1000 毫秒= 7776000000 并与减法结果作为替代。
db.CollectionA.aggregate([
{
"$lookup": {
"from": "CollectionB",
"localField": "mainId",
"foreignField": "mainId",
"as": "validd"
}
},
{
"$match": {
$expr: {
$or: [
{
$eq: [
"$validd",
[]
]
},
{
$and: [
{
$ne: [
"$validd",
[]
]
},
{
$lt: [
"$createdAt",
{
"$subtract": [
"$$NOW",
7776000000
]
}
]
}
]
}
]
}
}
}
])
这里是Mongo playground供您参考。
下面的代码 return 向我提供了存在于 CollectionA 但不存在于 CollectionB 中的所有数据。 (使用 mainID
作为参考)。
return this.aggregate([
{
$lookup: {
from: 'CollectionB',
localField: 'mainId',
foreignField: 'mainId',
as: 'validd',
},
},
{
$match: {
'validd.mainId': { $exists: false },
},
},
]);
但现在我需要添加另一个 过滤器。我还需要获取字段 createdAt
大于 90 天的数据。
换句话说:生命周期超过 90 天的记录。
尝试在 $match
中使用 $gte
和 $lte
但没有成功。
{
$match: {
'validd.createdAt': { $gte: moment.utc().add(-90, "days") },
},
},
这个return没什么。
我的数据库:
{
_id: 227dd33c5c51c79f63743da3
mainId: 5c306562-9c87-48dd-93ca-4a118be50490
createdAt: 2022-05-07T02:28:12.537+00:00
},
{
_id: f3ddd33c5c51c79f63743da3
mainId: 5c306562-9c87-48dd-93ca-4a118be50490
createdAt: 2022-05-10T02:28:12.537+00:00
},
{
_id: 227dd33c5c51c79f63743da3
mainId: 5c306562-9c87-48dd-93ca-4a118be50490
createdAt: 2022-01-01T02:28:12.537+00:00
}
我们可以忽略所有数据,只需要关注createdAt
。
我想保留 $lookup 逻辑,但也将过滤器添加到 return 只有 createdAt
大于 90 天的行(考虑当天/今天) .
所以按照这个逻辑,只有 last 记录应该被 returned,因为所有其他行都是在 内创建的90 天前
编辑
澄清一下。我需要 return 数据如果:
- collectionA 的行在 collectionB 中不存在
- 集合 B 中存在集合 A 的行 但是
createdAt
超过 X 天。
根据@ray
的回答试过了 return this.aggregate([
{
$lookup: {
from: 'CollectionB',
localField: 'mainId',
foreignField: 'mainId',
as: 'validd',
},
},
{
$match: {
$expr: {
$or: [
{
$eq: ["$validd", []]
},
{
$and: [
{
$lt: [ "validd.createdAt", moment.utc().add(-interval, "days").format('YYYY-MM-DD') ]
},
{
$ne: ["validd", null]
}
]
}
]
}
},
},
]);
您可以在 $match
$expr
中简单地使用 $or
db.CollectionA.aggregate([
{
"$lookup": {
"from": "CollectionB",
"localField": "mainId",
"foreignField": "mainId",
"as": "validd"
}
},
{
"$match": {
$expr: {
$or: [
{
$eq: [
"$validd",
[]
]
},
{
$and: [
{
$ne: [
"$validd",
[]
]
},
{
$lt: [
"$createdAt",
{
"$dateSubtract": {
"startDate": "$$NOW",
"unit": "day",
"amount": 90
}
}
]
}
]
}
]
}
}
}
])
这里是Mongo playground供您参考。
对于MongoDB v5.0 之前的版本,您可以$subtract
$$NOW
90 天* 24 小时* 60 分钟* 60 秒* 1000 毫秒= 7776000000 并与减法结果作为替代。
db.CollectionA.aggregate([
{
"$lookup": {
"from": "CollectionB",
"localField": "mainId",
"foreignField": "mainId",
"as": "validd"
}
},
{
"$match": {
$expr: {
$or: [
{
$eq: [
"$validd",
[]
]
},
{
$and: [
{
$ne: [
"$validd",
[]
]
},
{
$lt: [
"$createdAt",
{
"$subtract": [
"$$NOW",
7776000000
]
}
]
}
]
}
]
}
}
}
])
这里是Mongo playground供您参考。