mongodb 如何在$lte中添加条件?

7jmck4yq  于 2023-08-04  发布在  Go
关注(0)|答案(2)|浏览(98)

我有一个收藏:

@Prop({ type: Number, required: true, default: 0 })
   have:number;
   @Prop({ type: Boolean, required: false, default: null })
   unstable?: boolean;
   @Prop({ type: Number, required: false, default: null })
   max?: number;

字符串
我需要根据这个原则过滤选择。如果unstable = true,则不选择,如果等于false或null,则忽略过滤器第二个have条件必须小于max,但仅当max!== null否则忽略此过滤器
此外,这两个条件都必须通过,即如果记录不符合某些条件,则我们不将其添加到选择中
第一个条件一切都很清楚,很容易检查是否不稳定!== true,则忽略但在第二种情况下,我通常无法设计滤波器。我觉得我做的一切都是对的,但是不管用。
总的来说,这是我想出来的

{
         $and:[
           {
             unstable: {
               $ne: true
             },
           },
           {
             have: {
               $lte: {
                 cond: { // tried to write $cond as well, doesn't swear at anything, but there is no result
                   if: {
                     max: { $eq: null },
                   },
                   then: Infinity,
                   else: '$max', // tried to use Infinity here too, silence too
                 },
               },
             },
           },
         ],
       }


我的逻辑是这样的:

have <= (max === null ? Infinity : max)


我也测试了这个选项,它的作品

have: {
   $lte: Infinity
}


p.s.数据示例

{
    id: 1,
    max: 10,
    have: 1,
    unstable: null,
  },
  {
    id: 2,
    max: 10,
    have: 10,
    unstable: null,
  },
  {
    id: 3,
    max: null,
    have: 1,
    unstable: null,
  },
  {
    id: 4,
    max: null,
    have: 1,
    unstable: true,
  },


预期输出ID:1和3
id 2不包含,因为have >== max id 4不包含,因为unstable = true
p.s.s. https://mongoplayground.net/p/MriDNX6U7El

uyto3xhc

uyto3xhc1#

你可以试试这个:

db.collection.find({
   unstable: { $ne: true },
   $expr: {
      $cond: {
         if: { $eq: ["$max", null] },
         then: true,
         else: { $lte: ["$have", "$max"] }
      }
   }
})

字符串
或者稍微短一点:

db.collection.find({
   unstable: { $ne: true },
   $expr: { $lte: ["$have", { $ifNull: ["$max", MaxKey()] }] }
})


也许MaxKey在您的客户端中不可用,那么您可以使用

db.collection.find({
   unstable: { $ne: true },
   $expr: { $lte: ["$have", { $ifNull: ["$max", true] }] }
})


因为根据升序/降序排序,布尔值总是大于任何数值。
不要将比较查询运算符误认为是比较表达式运算符。比较查询运算符直接用于find,比较表达式运算符用于聚合管道和$expr文档。

ecbunoof

ecbunoof2#

您应该使用$project来比较相同的字段document。试试这个:

db.collection.aggregate([
  {
    $project: {
      isCorrect: {
        "$cond": {
          "if": ["$max",null],
          "then": true,
          "else": {
            "$lte": ["$have","$max"]
          }
        }
      },
      doc: "$$ROOT"// for get the whole documents
      
    }
  },
  {
    "$match": {
      isCorrect: true
    }
  }
])

字符串
链接mongoPlayground在here

相关问题