我正在尝试在聚合上使用 $filter 。我需要过滤一个名为“extras”的数组,该数组至少与他的一个“季节”与给定的“日期”相交。
这里是一个例子:
var from = new Date(2016, 0, 1);
var to = new Date(2016, 0, 5)
var projection = {
name: 1,
units: 1,
capacity: 1,
availabilitySeasons: { // This works
$filter: {
input: '$availabilitySeasons',
as: 'avSeason',
cond: {
$and: [{
$lte: ['$$avSeason.from', to]
}, {
$gte: ['$$avSeason.to', from]
}]
}
}
},
rate: 1,
features: 1,
extras: {
$filter: { // $elemMatch is no valid
input: '$extras',
as: 'extra',
cond: {
$elemMatch: ['$$extra.seasons', {
from: {
$lte: from
},
to: {
$gte: to
}
}]
}
}
}
};
在这种情况下可以使用 $filter 吗?我是否必须匆忙穿过 $unwind/$group hell ?
是的,你可以做到。对于以下示例,在 $and 条件内使用包含 $lte 和 $gte 的条件。
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: {
$and: [
$lt: [ "$$item.price", 100 ],
$gt: [ "$$item.price", 50 ]
] }
}
}
}
我是一名优秀的程序员,十分优秀!