首页 > 解决方案 > 根据定义的模式在集合中进行比较时,Mongoose 是否隐式转换字段的类型?

问题描述

所以我有一个猫鼬模式,它有以下字段:

var orderSchema = new Mongoose.Schema({
    status:{
          type: Types.String,
          enum: ['0','2', '6', '9', '10', '11', '12'],
          default: '0'
    }
});
Mongoose.model("order", orderSchema);

上述状态字段的类型为string

假设您有一个状态字段,其中"2"包含 db 中的值。如果我从 mongo shell 运行以下查询,它不会给出任何结果:

db.orders.findOne({status: 2});

不会工作,正如预期的那样,这会工作

db.orders.findOne({status: "2"});

但是,当我在node.js代码中使用mongoose(ver:"^4.13.14")执行查询时,这可行:

orders.findOne({status: 2})

那么,想了解 mongoose 是否根据定义的模式在内部进行这种转换?或者在幕后发生了其他事情。

标签: node.jsmongodbmongoose

解决方案


mongoose 中的枚举只是一个string带有额外验证器的。您可以观察到常规字符串的相同行为,例如:

let orderSchema = new mongoose.Schema({
  status:{
      type: String
    }
  });

let Order = mongoose.model("orders", orderSchema);
let doc = await Order.findOne({ status: 2 });

浏览find 文档,您可以阅读:

在发送命令之前,条件被转换为它们各自的 SchemaType。


推荐阅读