我在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类型的排序相同的比较顺序,对我来说感觉很奇怪。
在这种情况下,有没有办法获得所有匹配的文件?
答案 0 :(得分: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 : {}
的文档。