MongoDB查询中JavaScript非严格比较的等价物

MongoDB查询中JavaScript非严格比较的等价物,javascript,mongodb,comparison,equality,Javascript,Mongodb,Comparison,Equality,我相信这个问题以前一定有人问过,但我找不到任何关于这个话题的参考资料 我使用本地JavaScript驱动程序查询MongoDB集合,使用URL querystring上提供的数据作为输入,因此它不携带类型信息,只被视为字符串 问题是,我试图与此输入匹配的数据在集合中可能属于不同的类型,例如Number,但我无法提前预测。据我所知,Mongo默认比较运算符使用严格的语义进行操作,因此此查询: collection.find({ fieldName: value }) 与此JavaScript代码

我相信这个问题以前一定有人问过,但我找不到任何关于这个话题的参考资料

我使用本地JavaScript驱动程序查询MongoDB集合,使用URL querystring上提供的数据作为输入,因此它不携带类型信息,只被视为
字符串

问题是,我试图与此输入匹配的数据在集合中可能属于不同的类型,例如
Number
,但我无法提前预测。据我所知,Mongo默认比较运算符使用严格的语义进行操作,因此此查询:

collection.find({ fieldName: value })
与此JavaScript代码等效:

fieldName === value
然而,我希望在此场景中应用非严格语义(
=
),以便
“123”
的值将同时匹配
“123”
123

有人知道这是否可以在不影响查询性能的情况下实现吗

问题是,我试图与此输入匹配的数据在集合中可能属于不同的类型,例如数字

对于大多数通过数据类型实现某种安全级别的数据库来说,这似乎是一个重大问题

如果您不在MySQL中对其进行说明,这可能是一个真正的问题,例如,在MySQL中,默认情况下没有其他设置,它会丢失比较

由于丢失比较,您实际上可以返回不应该返回或不想返回的数据(否则如何将字符串转换为int?)

无论如何,是的,这听起来像是一个本来就不应该存在的问题

但我无法提前预测

但不管怎样,您都可以将所有输入标准化为字符串。所以,即使是纯数字,如果要与字符串进行比较,也可以作为字符串

这样就不需要对数据类型进行篡改,您可以以标准化的方式进行查询

反正

有人知道这是否可以在不影响查询性能的情况下实现吗

没有

问题是,我试图与此输入匹配的数据在集合中可能是不同类型的,例如数字,但我无法提前预测

如果无法将值标准化为一致的类型,则始终可以使用查找替代项,例如:

db.test.find({ fieldName: { $in: [123, "123"]}})
fieldName
上的索引将包括数值和字符串值

使用混合类型时需要注意的一个警告是,按该字段排序可能不会像您预期的那样工作。数字和字符串具有不同的属性,例如:


与OP不同,我可以判断集合中的哪些字段将是数字。
但我面临着OP的同样问题:req.query对象中的字段都是字符串。
因此,我用我想分享的代码片段对它们进行编号:

purchaseNumericfields = [ "component", "cook", "cost", "date", 
"_id","packSize", "price", "quantity", "supplier", "time", ];
const htmlQuery = { ...req.query };
for (let [key, value] of Object.entries( htmlQuery )) {
  if( purchaseNumericfields.includes( key )){
    htmlQuery[ key ] = Number( value );
  };
};

这应该确保
Number()
不会在恶意非数字字段上返回NaN

在现实中,将所有数据输入标准化为字符串不是很容易吗?例如,如果您正在处理现有的数据存储,则不一定如此。我知道有一些解决办法,我的问题是这是否可能与mongo(你回答顺便说一句)的确,是的mongodb目前没有$lose运营商。我喜欢这个答案,因为它很聪明。但它需要在服务器中对req.query成员进行按摩,以添加非引号选项。因此,我将尝试我自己的解决方案,即有一个数字字段名列表并“取消引用”它们。与OP相比,我的情况似乎有所不同,因为我可以通过名称区分哪些字段是数字字段。
purchaseNumericfields = [ "component", "cook", "cost", "date", 
"_id","packSize", "price", "quantity", "supplier", "time", ];
const htmlQuery = { ...req.query };
for (let [key, value] of Object.entries( htmlQuery )) {
  if( purchaseNumericfields.includes( key )){
    htmlQuery[ key ] = Number( value );
  };
};