将字符串转换为双精度并与对象数组中进行比较

问题描述 投票:0回答:1

这是我的 mongo 样本集合,

{
   "_id" : ObjectId("62aeb8301ed12a14a8873df1"),
   "Fields" : [ 
    {
        "FieldId" : "name",
        "Value" : [ "test_123" ]
    }, 
    {
        "FieldId" : "mobile",
        "Value" : [ "123" ]
    }, 
    {
        "FieldId" : "amount",
        "Value" : [ "300" ]
    }, 
    {
        "FieldId" : "discount",
        "Value" : null
    }
  ]
 }

在这里我想获取匹配的记录,例如“Fields.FieldId”应该等于“amount”和“Fields.Value.0”应该大于0或其他给定的值。

请记下以下几点,

  • Fields.Value”也可能为空
  • 有时某些字段也可能不会出现在数组中

我已经尝试过如下所示,但不起作用,

db.form.aggregate([
{
  $match:
  {
    {
       $expr: {
          $ne: [
             { $filter: { 
                input: '$Fields', 
                  cond: { if: {$eq:["$$this.FieldId", "amount"]}, 
                          then:{$gte: [{$toDouble: "$$this.Value.0"}, 0]} }
                  } 
               }, []
           ]
         }
      }
    }
}])

我不想使用 $project 或 $addFields。我只想直接进行 $match 查询。如果可以的话请推荐我。

提前致谢, 玛尼

mongodb aggregation-framework
1个回答
0
投票
  1. 使用

    $and
    运算符来匹配多个条件,而不是
    if
    then

  2. 使用

    $first
    运算符获取数组中的第一个元素。

  3. 此外,在

    {}
    阶段还有额外的大括号
    $match
    会破坏查询。取下额外的支架
    {}

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $ne: [
          {
            $filter: {
              input: "$Fields",
              cond: {
                $and: [
                  {
                    $eq: [
                      "$$this.FieldId",
                      "amount"
                    ]
                  },
                  {
                    $gte: [
                      {
                        $toDouble: {
                          $first: "$$this.Value"
                        }
                      },
                      0
                    ]
                  }
                ]
              }
            }
          },
          []
        ]
      }
    }
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.