2016-06-13 302 views
2

因此,我将一个post的ObjectId存储在一个comment BSON中。我BSON模式的一个例子如下:

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

现在,我要找到帖子ID 5700edfe03fcdb000347bebc下面的所有帖子。

所以我去:

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

然而,$ LT聚集算一个比较的String ID代替ObjectID和返回的结果仍然是准确的。所以,如果这是我postids的列表:

{ "_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

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 

给出17个字节以下objeciId。

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