MongoDB:是一个$ lt比较String ID等价于ObjectID比较吗?

时间:2016-06-13 18:28:22

标签: javascript mongodb aggregation-framework

所以我将post的ObjectId存储在comment BSON中。我的BSON架构的一个例子如下:

{ "_id" : ObjectId("570175e6c002e46edb92aaa5"), "userid" : "56f3f70d4de8c74a69d1d5e1", "postid" : "5700edfe03fcdb000347beaa" }

现在,我想查找postid 5700edfe03fcdb000347bebc下面的所有帖子。

所以我去了:

"$match" : {
            "postid" : {
                "$lt" : "5700edfe03fcdb000347bebc"
            }
}

但是,$ lt聚合运算符正在比较String ID而不是ObjectID,并且返回的结果仍然准确。所以,如果这是我的postid列表:

{ "_id" : "5700edfe03fcdb000347beda" }
{ "_id" : "5700edfe03fcdb000347bebf" }
{ "_id" : "5700edfe03fcdb000347bebc" }
{ "_id" : "5700edfe03fcdb000347bebb" }
{ "_id" : "5700edfe03fcdb000347beaa" }
{ "_id" : "5700edfb03fcdb000347bebe" }
{ "_id" : "5700edfb03fcdb000347beba" }

它将返回:

{ "_id" : "5700edfe03fcdb000347bebb" }
{ "_id" : "5700edfe03fcdb000347beaa" }
{ "_id" : "5700edfb03fcdb000347bebe" }
{ "_id" : "5700edfb03fcdb000347beba" }

然而,我想知道这是否永远是真的还是以上只是运气?

据我所知,排序ObjectID将始终返回准确的结果,因为在ObjectId中是一个时间戳,因此它可以使用时间戳来准确地对ObjectId进行排序。在字符串中,没有时间戳,所以它会准确排序吗?

1 个答案:

答案 0 :(得分:1)

Mongo使用ASCII-betically字符串比较,区分大小写。在这种情况下,这将起作用,但考虑到性能领域 - 它很慢。

由于objectId字段是一个12位对象,所以它在字符串中等效的字符串会占用更多空间,有两个文件

{
    "_id" : ObjectId("575f2aa031dcfb59af388e1f"),
    "a" : 2.0,
    "id" : "575f2a5731dcfb59af388e1e"
},{
    "_id" : ObjectId("575f2ab031dcfb59af388e21"),
    "a" : 3.0,
    "id" : ObjectId("575f2ab031dcfb59af388e20")
}

并检查尺寸:

Object.bsonsize(db.test.findOne({a:2})) // returns 66
Object.bsonsize(db.test.findOne({a:3})) // returns 49
使用objeciId时,

减少了17个字节。

游戏是否值得交易?是的,当字段被索引时 - 索引文件较小=>更快,更少读取,更高性能