【问题标题】:How create range filter by several fields in MongoDB?如何通过 MongoDB 中的多个字段创建范围过滤器?
【发布时间】:2015-09-28 14:51:14
【问题描述】:

我有 Mongo 收藏

{ A: 1, B: 1, C: 1 }
{ A: 1, B: 1, C: 2 }
{ A: 1, B: 2, C: 1 }
{ A: 1, B: 2, C: 2 }
{ A: 2, B: 1, C: 1 }
{ A: 2, B: 1, C: 2 }
{ A: 2, B: 2, C: 1 }
{ A: 2, B: 2, C: 2 }

通过 A、B 和 C 的复合索引。现在我想查询大于 { A: 2, B: 1, C: 1 } 的记录。结果应该是

{ A: 2, B: 1, C: 2 }
{ A: 2, B: 2, C: 1 }
{ A: 2, B: 2, C: 2 }

我想准确地使用范围查询(不是排序 + 跳过)。有可能吗?

更新: 抱歉,我的例子不太准确。

  1. 结果不是更大,而是大于或等于。
  2. 我想查询整个字段集 A、B 和 C,而不是单独查询。

感谢@BlakesSeven 的建议。

这是另一个例子:

大于{ A: 1, B: 1, C: 2 }

{ A: 1, B: 2, C: 1 }
{ A: 1, B: 2, C: 2 }
{ A: 2, B: 1, C: 1 }
{ A: 2, B: 1, C: 2 }
{ A: 2, B: 2, C: 1 }
{ A: 2, B: 2, C: 2 }

更新 2: 对不起我的小问题。我试着再解释一次: 我的集合按几个字段(A、B 和 C)排序。我使用compound indexes{ A: 1, B: 1, C: 1 }。排序集合:

1: { A: 1, B: 1, C: 1 }
2: { A: 1, B: 1, C: 2 }
3: { A: 1, B: 2, C: 1 }
4: { A: 1, B: 2, C: 2 }
5: { A: 2, B: 1, C: 1 }
6: { A: 2, B: 1, C: 2 }
7: { A: 2, B: 2, C: 1 }
8: { A: 2, B: 2, C: 2 }

我有一些记录(例如 5),我想查询按此顺序(6、7、8)更大的记录。

【问题讨论】:

  • 我会注意到,在您要求的任何方面,所需的结果都不是“大于”,而是“大于或等于”。这也是一个明显的“抽象”问题,可能与您的实际用例无关。要获得“真实”的答案,请展示您的“真实”用例,以便可以清楚地提供适合您真实需求的答案,并避免与 cmets 中的受访者争论。
  • 那么 A、B 或 C 需要更大吗?对吗?
  • @ThomasBormans,没有。所有记录都按 A、B 和 C 排序。我想从特定位置查询记录(见示例)

标签: mongodb mongodb-query


【解决方案1】:

棘手但可能

 var a = 1;
 var b = 2
 var c = 3;
 var value = a*100+b*10+c;
 db.collection.aggregate([{$project:{_id:0,A:1,B:1,C:1,D:{$add:[{$multiply:[100,"$A"]},{$multiply:[10,"
$B"]},"$C"]}}},{$match:{D:{$gt:value}}}]);

【讨论】:

    【解决方案2】:

    Mongo 具有 min() 功能,在这种情况下正好使用。
    所以为了收藏

    { A: 1, B: 1, C: 1 }
    { A: 1, B: 1, C: 2 }
    { A: 1, B: 2, C: 1 }
    { A: 1, B: 2, C: 2 }
    { A: 2, B: 1, C: 1 }
    { A: 2, B: 1, C: 2 }
    { A: 2, B: 2, C: 1 }
    { A: 2, B: 2, C: 2 }
    

    查询“大于或等于”{ A: 1, B: 1, C: 2 }

    db.collection.find().sort({A: 1, B: 1, C: 1}).min({ A: 1, B: 1, C: 2 })
    

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多