我尝试使用
创建索引db.collection_name.createIndex({"field_name":1})
然后,当我打电话给getIndexes()
时,它会给我以下结果
{
"v" : 2,
"key" : {
"field_name" : 1.0
},
"name" : "field_name_1",
"ns" : "dbname.collection_name"
}
所以我想知道为什么它现在是浮点"field_name" : 1.0
?这不好吗?我应该担心吗?有没有办法让它完全1
?
出于好奇:我注意到我甚至可以成功地这样称呼它:
db.collection_name.createIndex({"another_field_name":12345})
没有产生任何错误。我想知道在这种情况下发生了什么。
答案 0 :(得分:3)
你的问题实际上是几个问题,但第一个确实有一个简短的答案
问: "为什么我会得到一个浮动点?"
答:因为您使用的是robomongo,界面只是以这种方式显示提供的Number
类型。 mongo
shell实际上以不同方式显示
第二个:
问: "为什么我可以将12345
用作值而不只是1
或-1
?"
A :因为它实际上仍然是数字且有效。所有MongoDB关心的都是"积极的"或者"否定"。那么"积极"发出使用索引的查询将排序"升序"默认情况下。但您仍然需要向特定1
提供-1
或.sort()
,因为这是有效的。
要演示后一种情况,请在您的集合中插入一些数据:
db.collection_name.insertMany(
[5,1,3].map( v => ({ another_field_name: v }) )
)
创建索引:
db.collection_name.createIndex({ "another_field_name": 12345 })
如果您发出范围查询,则"升序"订单由"肯定"值:
db.collection_name.find({ "another_field_name": { "$gt": 0 } },{ "_id": 0 })
{ "another_field_name" : 1.0 }
{ "another_field_name" : 3.0 }
{ "another_field_name" : 5.0 }
这显示了即使实际插入值的顺序不同,也会应用索引的顺序。所以索引在这里得到了明确的应用。
如果您尝试在此类索引上使用1
或-1
之外的任何其他值明确.sort()
,则会产生错误。但当然这会导致提升"或"降序"分别排序,因为MongoDB会愉快地颠倒索引的遍历顺序。
如果您删除了索引并使用"否定"创建了索引。值:
db.collection_name.dropIndexes();
db.collection_name.createIndex({ "another_field_name": -54321 });
然后发出相同的查询:
db.collection_name.find({ "another_field_name": { "$gt": 0 } },{ "_id": 0 })
{ "another_field_name" : 5.0 }
{ "another_field_name" : 3.0 }
{ "another_field_name" : 1.0 }
然后"降序"因为这基本上是你告诉它在默认处理中做的事情所以应用了这个命令。
这总体上是好还是坏?从存储的角度来看它确实没关系,因为无论实际值如何,BSON Double仍然是BSON Double。
您可以将NumberInt
替换为特定的32位值,而不是BSON Types中指定的64位值,但值1
或{{1反之,65,000
或-1
不会改变分配的存储或基本处理它的位置" postive"或"否定"。
为了一般的可读性和与.sort()
的参数的一致性,然后作为一个"意见问题",使用-65,000
和1
可以更加一致地理解它&#39预期目的。
实际上是"首选"关于规范的实现,有点echoed in the documentation(虽然没有突出):
某些驱动程序可能使用NumberLong(1)而不是1作为规范来指定索引。这对结果索引没有任何影响。