所以我将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进行排序。在字符串中,没有时间戳,所以它会准确排序吗?
答案 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个字节。
游戏是否值得交易?是的,当字段被索引时 - 索引文件较小=>更快,更少读取,更高性能