【问题标题】:MongoDB - elemMatch with range of numbers not working as expected?MongoDB - 具有数字范围的 elemMatch 不能按预期工作?
【发布时间】:2021-05-11 12:36:54
【问题描述】:

我有一个包含如下文档的集合:

_id1:
Price:[1,100000]

_id2:
Price:[1,98500]

_id3:
Price:[1,3005]

..etc

遵循本文档:https://docs.mongodb.com/manual/reference/operator/query/elemMatch/

我尝试重现对某个价格范围内的元素的查找,但不幸的是它对我不起作用,即使它们不符合条件,我也会取回所有元素。我做错了什么?

我的查询:

{ Price:{ $elemMatch: { $gte: 1, $lt: 85 } } }

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    $elemMatch已经提过了,

    $elemMatch 运算符匹配包含数组字段且至少有一个元素匹配所有指定查询条件的文档。

    让我们调试您的文档并输入为什么它的结果是所有文档,

    = (1 >= 1 && 1 或
    false = (100000/98500/3005 >= 1 && 100000/98500/3005

    每个文档中都有一个值 1 为真,因此如果数组中的一个元素条件为真,$elemMatch 将生成文档。


    您可以使用替代选项来满足您的要求,

    • $expr 匹配表达式条件
    • $filter 迭代 Price 数组的循环并匹配两个条件,
    • $eq 检查过滤的Price 数组和实际的Price 数组都应该相同
    db.collection.find({
      $expr: {
        $eq: [
          {
            $filter: {
              input: "$Price",
              cond: {
                $and: [{ $gte: ["$$this", 1] }, { $lt: ["$$this", 85] }]
              }
            }
          },
          "$Price"
        ]
      }
    })
    

    Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多