MongoDB BSON提供了对除JSON之外的其他数据类型的支持。具体请参考json扩展


文章目录

  • 类型
  • 日期
  • 以字符串格式返回日期
  • 以Date格式返回日志
  • ObjectId
  • NumberLong
  • NumberInt
  • NumberDecimal
  • 比较和排序
  • 查看是否是十进制类型
  • 查看字段类型


类型

日期

mongo shell提供各种各样的方法来返回date,包括string类型和Date 对象

  • Date()方法以字符串的格式返回当前日期时间
  • new Date() 构造函数使用 ISODate() 装饰器返回一个Date对象
  • ISODate()构造函数使用 ISODate() 装饰器返回一个Date对象

在mongoDB内部,日期对象存储为带符号的64位整数,表示自1970年1月1日以来的毫秒数。

并非所有的数据库操作和驱动程序都支持完整的64位范围。您可以安全地使用包含0到9999年的日期。

以字符串格式返回日期

Date方法返回字符串格式的日期

> var myDateString = Date();
> myDateString
Mon Mar 18 2019 14:39:56 GMT+0800 (CST)
> typeof myDateString
string

以Date格式返回日志

> var myDate = new Date();
> var myDateInitUsingISODateWrapper = ISODate();
> var myNewDateInitUsingISODateWrapper = new ISODate();
> myDate
ISODate("2019-03-18T06:42:25.682Z")
> myDateInitUsingISODateWrapper
ISODate("2019-03-18T06:42:26.888Z")
> myNewDateInitUsingISODateWrapper
ISODate("2019-03-18T06:42:58.503Z")
> myDate instanceof Date
true
> myDateInitUsingISODateWrapper instanceof Date
true
> typeof myNewDateInitUsingISODateWrapper
object
> myNewDateInitUsingISODateWrapper instanceof Date
true

ObjectId

mongoDB Shell提供了 ObjectId() 包装类,如果要想生成一个新的ObjectId

> new ObjectId
ObjectId("5c8f4008ba43cf660ec8633e")

具体:ObjectId

NumberLong

mongo shell默认将所有数字视为浮点值。mongo shell提供了numberlong()包装器来处理64位整数。
numberlong()包装器接收一个字符串参数:

> NumberLong("2090845886852")

具体例子:

> db.collection.insertOne( { _id: 10, calc: NumberLong("2090845886852") } )
> db.collection.updateOne( { _id: 10 },
... { $set:  { calc: NumberLong("2555555000000") } } )
> db.collection.updateOne( { _id: 10 },
...   { $inc: { calc: NumberLong(5) } } )
> db.collection.findOne({_id:10})
{ "_id" : 10, "calc" : NumberLong("2555555000005") }

如果使用$inc将包含numberlong对象的字段的值增加一个浮点值,则数据类型将更改为浮点值,如下例所示:

> db.collection.updateOne( { _id: 10 },
... { $inc: { calc: 5 } } )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.collection.findOne( { _id: 10 } )
{ "_id" : 10, "calc" : 2555555000010 }

NumberInt

mongo shell默认将所有数字视为浮点值。mongo shell提供了numberint()构造函数来显式指定32位整数。

NumberDecimal

New in version 3.4.

mongo shell默认将所有数字视为64位双精度浮点值。mongo shell提供了numberdecimal()构造函数来显式指定基于128位十进制的浮点值,十分精确。此功能适用于处理货币数据(如财务、税务和科学计算)的应用程序。

numberdecimal()接收一个字符串参数[推荐];以及小数参数,但是不建议这么做,因为这可能丢失精度

> NumberDecimal("1000.55")
NumberDecimal("1000.55")
> NumberDecimal(1000.55)
NumberDecimal("1000.55000000000")
> NumberDecimal(9999999.4999999999)
NumberDecimal("9999999.50000000")

备注:请具体看mongoDB 驱动是否支持这个功能

比较和排序

> db.numbers.insert({ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" })
> db.numbers.insert({ "_id" : 2, "val" : 9.99, "description" : "Double" })
> db.numbers.insert({ "_id" : 3, "val" : 10, "description" : "Double" })
> db.numbers.insert({ "_id" : 4, "val" : NumberLong(10), "description" : "Long" })
> db.numbers.insert({ "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" })

db.numbers.find(< query >)

python mongodb 日期 mongodb date_字符串

查看是否是十进制类型

没看懂
使用字符串别名为“decimal”的$type运算符或十进制类型的数字代码19。

> db.inventory.find( { price: { $type: "decimal" } } )

查看字段类型

  • instanceof :是不是
  • typeof:是什么
mydoc._id instanceof ObjectId
typeof mydoc._id