首页 > 解决方案 > MongoDB以数组作为输入查询下限/上限范围

问题描述

在 MongoDB 中,我有一个如下所示的集合:

{ low: 1, high: 5 },
{ low: 6, high: 15 },
{ low: 16, high 412 },
...

我输入的是一个整数数组:

[ 4, 16, ...]

我想找到集合中的所有文档,其值包含在低和高所描述的范围内。在此示例中,它将选择第一个和第三个文档。

我在这里找到了很多关于如何使用单个值作为输入进行过滤的问答,但找不到包含数组作为输入的问答。可能是我的搜索失败了,这已经得到了回答。

更新:我应该提到我在应用程序中构建此查询,而不是在 CLI 中运行它。鉴于这种灵活性,如果我$or使用每个输入创建一个查询会怎样?就像是:

$or: [{
  high: { $gte: 4 },
  low: { $lte: 4 },
}, {
  high: { $gte: 16 },
  low: { $lte: 16 },
},
...
]

它可能是巨大的,并且在$or.

标签: mongodbmongodb-query

解决方案


//working code from Mongo Shell CLI 4.2.6 on windows 10
//you can use forEach and loop through for comparison if a value exists between two numbers
> print("MongoDB",db.version());
MongoDB 4.2.6
> db.lhColl.find();
{ "_id" : ObjectId("5f889258f3b30cd04c8a78e5"), "low" : 1, "high" : 5 }
{ "_id" : ObjectId("5f889258f3b30cd04c8a78e6"), "low" : 6, "high" : 15 }
{ "_id" : ObjectId("5f889258f3b30cd04c8a78e7"), "low" : 16, "high" : 412 }
> var arrayInput = [4,16,500];
> var inputLength = arrayInput.length;
> db.lhColl.aggregate([
... {$match:{}}
... ]).forEach(function(doc){
...     for (i=0; i<inputLength; i++){
...      if (arrayInput[i]>=doc.low){
...         if(arrayInput[i] <= doc.high)
...           print("arrayInputs value match:",arrayInput[i]);
...     }
... }
... });
arrayInputs value match: 4
arrayInputs value match: 16

推荐阅读