MongoDB v.3.2.11 / 4.2.0:多行值范围与对象字段的交集

问题描述 投票:0回答:1

这篇文章是之前文章的延续:

假设我们有一个对象字段有 6 列的 mongodb 集合:

  • investmentParameters.capitalAppreciationFrom
  • investmentParameters.capitalAppreciationTo
  • investmentParameters.rentalYieldFrom
  • investmentParameters.rentalYieldTo
  • 投资参数.占用率
  • investmentParameters.OccupancyRateTo

现在我想选择范围*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 个过滤器?

谢谢。

mongodb mongodb-query intersection intersect
1个回答
0
投票

您可以使用德摩根定律,那么您的查询将像这样简单:

db.collection.find({
  "investmentParameters.capitalAppreciationFrom": { $lt: 350 },
  "investmentParameters.capitalAppreciationTo": { $gt: 200 }
})

蒙戈游乐场

我非常确定,这适用于任何 MongoDB 版本。

© www.soinside.com 2019 - 2024. All rights reserved.