Mongodb 在mongo聚合中查找后排除空的forgien记录
下面我正在使用的代码返回组织列表,其中包含下周内发生的事件Mongodb 在mongo聚合中查找后排除空的forgien记录,mongodb,aggregate,lookup,Mongodb,Aggregate,Lookup,下面我正在使用的代码返回组织列表,其中包含下周内发生的事件 const today = new Date() const weekAfter = new Date() weekAfter.setDate(weekAfter.getDate() + 7) return Organizations.aggregate([ { $lookup: { from: 'events', localField: '_id', foreign
const today = new Date()
const weekAfter = new Date()
weekAfter.setDate(weekAfter.getDate() + 7)
return Organizations.aggregate([
{
$lookup: {
from: 'events',
localField: '_id',
foreignField: 'organizations.organizationId',
as: 'eventsData'
}
},
{
$project: {
name: 1,
logo: 1,
featuredImage: 1,
startTime: 1,
events: {
$filter: {
input: '$eventsData',
as: 'event',
cond: {
$and: [
{ $gt: ['$$event.startTime', today] },
{ $lt: ['$$event.startTime', weekAfter] }
]
}
}
}
}
}
]).exec()
return Organizations.aggregate([
{
$lookup: {
from: 'events',
localField: '_id',
foreignField: 'organizations.organizationId',
as: 'eventsData'
}
},
{
$unwind: {
path: "$eventsData",
preserveNullAndEmptyArrays: false
}
},
{
$group: {
_id : "$_id",
name: { $first : "$name" },
logo: { $first : "$logo" },
featuredImage: { $first : "$featuredImage" },
startTime: { $first : "$startTime" },
eventsData: { $push: "$eventsData" }
}
},
{
$project: {
name: 1,
logo: 1,
featuredImage: 1,
startTime: 1,
events: {
$filter: {
input: '$eventsData',
as: 'event',
cond: {
$and: [
{ $gt: ['$$event.startTime', today] },
{ $lt: ['$$event.startTime', weekAfter] }
]
}
}
}
}
}
]).exec()
我希望它只返回下周至少有一个活动的组织
我尝试了以下代码,但它只排除了组织,如果它没有任何相关事件,但包括空事件,即使它们在下周不会发生
const today = new Date()
const weekAfter = new Date()
weekAfter.setDate(weekAfter.getDate() + 7)
return Organizations.aggregate([
{
$lookup: {
from: 'events',
localField: '_id',
foreignField: 'organizations.organizationId',
as: 'eventsData'
}
},
{
$project: {
name: 1,
logo: 1,
featuredImage: 1,
startTime: 1,
events: {
$filter: {
input: '$eventsData',
as: 'event',
cond: {
$and: [
{ $gt: ['$$event.startTime', today] },
{ $lt: ['$$event.startTime', weekAfter] }
]
}
}
}
}
}
]).exec()
return Organizations.aggregate([
{
$lookup: {
from: 'events',
localField: '_id',
foreignField: 'organizations.organizationId',
as: 'eventsData'
}
},
{
$unwind: {
path: "$eventsData",
preserveNullAndEmptyArrays: false
}
},
{
$group: {
_id : "$_id",
name: { $first : "$name" },
logo: { $first : "$logo" },
featuredImage: { $first : "$featuredImage" },
startTime: { $first : "$startTime" },
eventsData: { $push: "$eventsData" }
}
},
{
$project: {
name: 1,
logo: 1,
featuredImage: 1,
startTime: 1,
events: {
$filter: {
input: '$eventsData',
as: 'event',
cond: {
$and: [
{ $gt: ['$$event.startTime', today] },
{ $lt: ['$$event.startTime', weekAfter] }
]
}
}
}
}
}
]).exec()
在此处签出并运行MongoDB查询尝试以下操作:
return Organizations.aggregate([
{
$lookup: {
from: 'events',
localField: '_id',
foreignField: 'organizations.organizationId',
as: 'eventsData'
}
},
{
$project: {
name: 1,
logo: 1,
featuredImage: 1,
startTime: 1,
events: {
$filter: {
input: '$eventsData',
as: 'event',
cond: {
$and: [
{ $gt: ['$$event.startTime', today] },
{ $lt: ['$$event.startTime', weekAfter] }
]
}
}
}
}
},
{
$match:{
"events.0":{
$exists:true
}
}
}
]).exec()
试试这个:
return Organizations.aggregate([
{
$lookup: {
from: 'events',
localField: '_id',
foreignField: 'organizations.organizationId',
as: 'eventsData'
}
},
{
$project: {
name: 1,
logo: 1,
featuredImage: 1,
startTime: 1,
events: {
$filter: {
input: '$eventsData',
as: 'event',
cond: {
$and: [
{ $gt: ['$$event.startTime', today] },
{ $lt: ['$$event.startTime', weekAfter] }
]
}
}
}
}
},
{
$match:{
"events.0":{
$exists:true
}
}
}
]).exec()
核对