【问题标题】:Mongoose return document only if all sub-list elements match query仅当所有子列表元素都匹配查询时,猫鼬才返回文档
【发布时间】:2017-08-13 10:52:54
【问题描述】:

我有这样的简单结构:

{
_id: "4f23f23f432f43" //random _id
list: [
    {
        price: 8
    },
    {
        price: 13
    },
    {
        price: 17
    },
  ]
}

上面的例子是简单的模式,它的基础是几个对象的列表。 我的问题是我无法让它工作:

dbQuery.menu = {
$elemMatch : {
    price: {
        $gte: request.query.minPrice
    }
  }
}

我需要只查找这些文档,其中所有数组元素都与此查询匹配。意思是,只有当它的列表只包含大于(或等于)指定查询值的值时才返回对象。

现在它返回至少一个列表元素高于指定值的所有对象,这是错误的。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    更新:

    如果要在查询条件中添加maxPrice字段,则必须是$or-组合语句,而不是$and。因为n >= minPrice && n <= maxPrice 应该等于!(n < minPrice || n > maxPrice)

    所以查询现在应该是这样的:

    YourModel.find({
      'list': { 
         $not: { 
           $elemMatch: {
             'price': {
                $or: [
                  { $lt: request.query.minPrice },
                  { $gt: request.query.maxPrice }
                ]
              }
           }
         }
      }
    });
    

    =====

    (这是旧答案)

    试试这个:

    YourModel.find({
      'list': { 
         $not: { 
           $elemMatch: {
             'price': {
                $lt: request.query.minPrice
              }
           }
         }
      }
    });
    

    【讨论】:

    • 谢谢!它就像一个魅力!我还有另一个问题,我也想制作上边界,比如“max”。当我尝试将简单的 $gt 添加到 $not 条件时,它没有用。我还应该放 $and 运算符来要求两个条件都是肯定的吗?
    • 或者其他方式.. 你能帮我实现两个字段的过滤吗?当我尝试为 maxPrice 上限添加“$gt: request.query.maxPrice”时,$not 不起作用。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2013-10-21
    • 2016-08-10
    • 2019-07-22
    • 2021-05-08
    • 2021-12-25
    相关资源
    最近更新 更多