【问题标题】:A range query on a mixed-type field doesn't return all documents混合类型字段的范围查询不会返回所有文档
【发布时间】:2015-02-12 21:44:53
【问题描述】:

我在 MongoDB 中有一个集合,其中一个字段可以具有混合类型的值。现在我想对该字段应用范围查询,但它不会返回所有匹配的文档。

value 字段对所有文档进行排序会返回数字值后跟字符串值,如the document 中所述。

> db.test.find().sort({ value: 1 })
{ "_id" : ObjectId("54dc639e498f5e13a42b0383"), "value" : 1 }
{ "_id" : ObjectId("54dc639e498f5e13a42b0384"), "value" : 2 }
{ "_id" : ObjectId("54dc639e498f5e13a42b0385"), "value" : 11 }
{ "_id" : ObjectId("54dc7757498f5e13a42b0386"), "value" : "3" }

但是当我使用范围查询时,它只返回 value 与查询中的值具有相同类型的文档。例如,下面的查询返回一个文档而不是两个。

> db.test.find({ value: { $gte: 11 } }).sort({ value: 1 })
{ "_id" : ObjectId("54dc639e498f5e13a42b0385"), "value" : 11 }

鉴于the document 说它使用与排序不同 BSON 类型相同的比较顺序,我觉得很奇怪。

在这种情况下有什么方法可以获取所有匹配的文档?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我认为这根本不是一个好的数据结构,但你说得对,这种行为很奇怪,应该被视为文档错误。

    此行为记录在perl driver documentation(“您必须使用正确的类型查询数据。”)并在question related to indexing here on SO 中解释。但是,无论是否使用索引,行为都是相同的。

    我能够使用 MongoDB 3.0-rc2 重现这一点。使用您的数据,

    > db.mixedType.find({"value" : {$gt : ""}});
    { "_id" : ObjectId("54dc7757498f5e13a42b0386"), "value" : "3" }
    
    > db.mixedType.find({"value" : {$gt : 10}})
    { "_id" : ObjectId("54dc639e498f5e13a42b0385"), "value" : 11 }.
    

    因此,将数字类型放在一边,比较不同类型会产生错误。我还尝试了空对象、空数组和布尔值,例如$gt : false 将返回一个带有 value : true 的文档,$gte: {} 将返回一个带有 value : {} 的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2021-07-29
      • 1970-01-01
      • 2021-07-26
      相关资源
      最近更新 更多