获取存储在 MongoDB at mongo shell 中的 BSON 类型的文档字段

Getting BSON type of document field stored in MongoDB at mongo shell

我的 MongoDB 数据库中有两个文档。它们是(简化):

{
    "_id" : "ONE",
    "items": [
        42,
        0
    ]
}

{
    "_id" : "TWO",
    "items": [
        0,
        0
    ]
}

它们是由客户端应用程序创建的(即不使用 MongoDB shell)我怀疑其行为(我的意思是,该应用程序可能有错误,我正在尝试调试它)。

我怀疑文档 ONE 中的数字 items 在 BSON 级别编码为 32 位整数(即 BSON type 16) while in document TWO they are encoded in double (i.e. BSON type 1)

我尝试使用 MongoDB shell 中 JavaScript 中的常用 typeof 运算符来检查它,但似乎他们没有检测到任何差异:

> typeof db.entities.find({_id: "ONE"})[0].items[0]
number
> typeof db.entities.find({_id: "ONE"})[0].items[1]
number
> typeof db.entities.find({_id: "TWO"})[0].items[0]
number
> typeof db.entities.find({_id: "TWO"})[0].items[1]
number

是否有任何精确的方法可以知道来自 MongoDB shell 的 MongoDB 文档的给定片段的 BSON 类型?

提前致谢!

您可以使用 aggregate with $type

playground

你的理解并不完全正确。 Mongo 默认情况下将数字视为双数。

看下面的例子,我强制加上一个整数然后它说它是整数。它不打印类型编号但类型名称

db.collection.aggregate([
  {
    "$unwind": "$items" //Denormalized
  },
  {
    "$addFields": {
      "x": {//All docs will have this - For demo purpose
        "$toInt": "11"
      }
    }
  },
  {
    "$project": {
      "t": {
        "$type": "$items" //Each element in the items - after denormalising
      },
      "t1": {
        "$type": "$x" //Type of newly added element
      }
    }
  }
])