8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

RandomInsano 1月前

19 0

这是我的 mongo 样本集合,{ \'_id\' : ObjectId(\'62aeb8301ed12a14a8873df1\'),\'Fields\' : [ { \'FieldId\' : \'name\', &...

这是我的 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 查询。如果可以的话,请给我建议。

提前致谢,Mani

帖子版权声明 1、本帖标题:将字符串转换为双精度数并与对象数组进行比较
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由RandomInsano在本站《mongodb》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 谢谢 Yong shun!你的答案虽然不错,但对我来说有些情况并不适用。但下面的答案对我的情况很适用。非常感谢@Yong!

    1. p0

    2. p1

    3. p2

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

    演示@Mongo Playground

  • 对数组字段执行元素检查的规范方法之一是使用 $anyElementTrue 。您可以首先使用 $map 在数组上应用条件来投影布尔数组并 $anyElementTrue 对其应用。

    1. 用于 $map 迭代 Fields 数组
    2. 检查是否 FieldId 等于 amount
    3. 尝试将 $convert 字符串值转换为双精度值。
      • if convert succeed, we keep the double value
      • if convert failed, says it is non-number, we fallback to default value of 0.0(or any value that is less than zero). So this query won't throw an exception even if your data does not have a value that is parseable into double.
    4. 将2和3的条件串起来, $and 与0进行比较,如果转换失败,则会回退到0.0,并且不会被选中。
    db.collection.aggregate([
      {
        "$match": {
          $expr: {
            "$anyElementTrue": {
              "$map": {
                "input": "$Fields",
                "as": "f",
                "in": {
                  "$and": [
                    {
                      "$eq": [
                        "amount",
                        "$$f.FieldId"
                      ]
                    },
                    {
                      $gt: [
                        {
                          "$convert": {
                            "input": {
                              "$first": "$$f.Value"
                            },
                            "to": "double",
                            "onError": 0.0,
                            "onNull": 0.0
                          }
                        },
                        0
                      ]
                    }
                  ]
                }
              }
            }
          }
        }
      }
    ])
    

    蒙戈游乐场

返回
作者最近主题: