这篇文章是之前文章的延续:
假设我们有一个对象字段有 6 列的 mongodb 集合:
现在我想选择范围*From / *与另一个范围相交的行。
例如:
[
{
_id: 1,
"investmentParameters": {
"capitalAppreciationFrom": 100,
"capitalAppreciationTo": 200,
"rentalYieldFrom": 150,
"rentalYieldTo": 155,
"occupancyRateFrom": 170,
"occupancyRateTo": 180
}
},
{
_id: 2,
"investmentParameters": {
"capitalAppreciationFrom": 150,
"capitalAppreciationTo": 300,
"rentalYieldFrom": 170,
"rentalYieldTo": 200,
"occupancyRateFrom": 170,
"occupancyRateTo": 180
}
},
{
_id: 3,
"investmentParameters": {
"capitalAppreciationFrom": 210,
"capitalAppreciationTo": 230,
"rentalYieldFrom": 100,
"rentalYieldTo": 110,
"occupancyRateFrom": 500,
"occupancyRateTo": 505
}
},
{
_id: 4,
"investmentParameters": {
"capitalAppreciationFrom": 300,
"capitalAppreciationTo": 350,
"rentalYieldFrom": 400,
"rentalYieldTo": 450,
"occupancyRateFrom": 560,
"occupancyRateTo": 650
}
},
{
_id: 5,
"investmentParameters": {
"capitalAppreciationFrom": 400,
"capitalAppreciationTo": 401,
"rentalYieldFrom": 500,
"rentalYieldTo": 503,
"occupancyRateFrom": 700,
"occupancyRateTo": 711
}
}
]
让我们从一个范围的简单查询开始。
过滤器#1
{
$expr: {
$let: {
vars: {
occupancyRateFilterFrom: 100,
occupancyRateFilterTo: 1500
},
in: {
$and: [
{
$not: {
$or: [
{
$gt: [
"$$occupancyRateFilterFrom",
"$investmentParameters.occupancyRateTo"
]
},
{
$gt: [
"$investmentParameters.occupancyRateFrom",
"$$occupancyRateFilterTo"
]
}]
}
}
}
}
}
}
还有这个演示。
过滤器#2
{
$expr: {
$and: [
{
$eq: [
{
$anyElementTrue: {
$map: {
input: {
$range: [201, 350, 1]
},
in: {
$and: [
{
$gte: [
"$$this",
"$investmentParameters.capitalAppreciationFrom"
]
},
{
$lte: [
"$$this",
"$investmentParameters.capitalAppreciationTo"
]
}
]
}
}
}
},
true]
}]
}
}
还有这个演示。
过滤器#3
{
$expr: {
$ne: [
{
$filter: {
input: {
$range: [201, 350, 1]
},
cond: {
$and: [
{
$gte: [
"$$this",
"$investmentParameters.capitalAppreciationFrom"
]
},
{
$lte: [
"$$this",
"$investmentParameters.capitalAppreciationTo"
]
}]
}
}
},
[]]
}
}
还有这个演示。
所有过滤器均适用于 mongoplayground.net。但是,当我对数据库使用此过滤器时,它不起作用(就像我使用空过滤器并获取所有记录的结果)(((
另外,如果它可能很重要:
/# mongo --version
MongoDB shell version v3.2.11 / v4.2.0
我恢复了 MongoDB shell 版本 8.0.0 的备份并检查了过滤器。所有过滤器都完美运行!
那么我如何为 MongoDB shell 版本 3.2.11 / 4.2.0 重写这 3 个过滤器?
谢谢。