【问题标题】:Mongo. how to check if field is a number蒙哥。如何检查字段是否为数字
【发布时间】:2013-04-27 18:29:53
【问题描述】:

如何选择字段为数字的mongodb文档?

该字段内容的一些示例:“2”、“a”、“Z”、3

【问题讨论】:

  • 一种方法是使用$type:db.col.find({Z: {$type:16}})
  • 是的,我试过了,但我认为应该有另一种解决方案。
  • 嗯,我想说的是正则表达式,但这只能知道字符串/整数是否是一个数字,它无法知道它是字符串还是整数的数据类型
  • 我认为,如果我们认为字段的长度 = 1(或一位数),问题会简单得多
  • 但是你想让它们都匹配吗?如果是这样你冷正则表达式它{field: /^[0-9]+$/}

标签: mongodb mongodb-query


【解决方案1】:

当前答案完全有效

关于类型/编号/别名的完整表格在BSON Types

现在,根据$type 文档

目前的解决方案

db.collection.find({$or : [{"field" : { $type : 1 }}, 
                           {"field" : { $type : 16 }}, 
                           {"field" : { $type : 18 }}]})

可以改进(我自己测试)到以下:

//based on 'Number' - see BSON Types
db.collection.find({ "field": { $type: [1, 16, 18] } })

//based on 'Alias' BSON Types
db.collection.find({ "field": { $type: ["double", "int", "long"] } })

因此可以避免使用$or 并重复多次相同 field 名称

【讨论】:

    【解决方案2】:

    随着mongodb 4.4(即将推出),您可以使用$isNumber管道运算符来检查表达式是整数还是其他BSON类型。

    db.collection.aggregate([
      { "$project": {
        "field": { "$isNumber": "$field" }
      }}
    ])
    

    并且只获取选定的文档

    db.collection.find({ "$expr": { "$anyElementTrue": { "$isNumber": "$field" }}})
    

    【讨论】:

      【解决方案3】:

      您可以改用别名“数字”:

      { field: {$type:"number"}}
      

      【讨论】:

        【解决方案4】:

        typeof 在 mongo 中也为 array 类型返回 object。要检查字段是否为 Number,请运行以下查询以查看它是否返回任何结果。

        db.foo.find('Object.prototype.toString.call(this.bar) === "[object Number]"')

        你也可以看到https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

        【讨论】:

        • 我需要一种方法来查找某个字段不是整数的记录,而这(用!== 替换 ===)效果很好;谢谢。
        【解决方案5】:

        你可以使用bar字段的类型

        typeof db.foo.findOne().bar
        

        http://docs.mongodb.org/manual/core/shell-types/#check-types-in-shell

        【讨论】:

          【解决方案6】:

          您可以使用$type 运算符根据字段的 BSON 类型进行选择,这应该可以满足您的需求。

          例如,要查找所有字符串:

          db.collection.find( { field: { $type : 2 } } )
          

          或者,要查找所有双精度数(由于默认的 Javascript 行为,这通常是从 shell 存储的数字),您可以使用:

          db.collection.find( { field: { $type : 1 } } )
          

          由于有两种类型的整数(可能),你需要使用这样的东西:

          db.collection.find({$or : [{"field" : { $type : 16 }}, {"field" : { $type : 18 }}]})
          

          最后,获取所有数字,整数或双精度数:

          db.collection.find({$or : [{"field" : { $type : 1 }}, {"field" : { $type : 16 }}, {"field" : { $type : 18 }}]})
          

          【讨论】:

          • $type 运算符在数字的字符串表示中效果不佳。还有其他想法吗?由于我有长度为 1 的字段,可能我可以使用 $in,但它看起来有点难看
          • 如果你有数字的字符串表示,那么它们是字符串,而不是数字。您可以使用正则表达式(昂贵),或者您可以编写一个函数来检查,但数据库中没有任何本机可以为您执行此操作。
          • 我们警告过:BSON 类型 2(字符串)将为包含字符串的数组返回真值。
          猜你喜欢
          • 2018-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多