我刚刚开始使用mongodb得到一个perl脚本,解析一个twitter流并将其添加到mongodb中。这部分工作正常。
但是我在使用PHP查询数据库时遇到困难。我有一个ajax和php的组合来查询数据库,目前获得最后30个条目。现在我想在这么多秒后得到最新的条目。使用mysql数据库,我只需将id作为参数传回,并从数据库中获取最新信息但是我不太确定如何使用mongodb。
我提出的两个选项是使用集合中的文档数量并使用它来获取跳过那么多文档的最新文档或者返回到perl脚本并将时间戳从twitter转换为更容易格式。
有更简单的方法吗?
答案 0 :(得分:1)
在MongoDB中跳过(如在关系数据库中)是非常昂贵的,特别是当数据库集合增长到非常大的大小时(如Twitter流集合可能)。这是因为Mongo必须对整个集合进行排序和扫描,然后迭代但不返回您正在跳过的文档数量。
解决此问题的更好方法是使用查询“搜索”到集合中的正确位置,然后从该点返回新结果。我假设您的推文文档有一个时间戳字段(BSON日期)。当您渲染页面(或通过AJAX更新它)时,您需要记住到目前为止您所看到的最新日期。然后你可以查询新的推文,如:
db.tweets.find({timestamp: {$gt: last_seen_timestamp}}).sort({timestamp: 1})
假设您有timestamp
的索引(或timestamp
是第一个字段的复合索引),这将会很有效。
答案 1 :(得分:0)
使用mysql数据库我只会将id作为参数传回 从数据库中获取最新信息,但我不太清楚如何处理 它为mongodb
同样的方式:) ObjectId基于时间戳,因此您只需使用$ gt来获取新插入的文档。例如,foo集合中有2个项目:
> db.foo.find().limit(10);
{ "_id" : ObjectId("4f156018ef7b8b0317a8ad18"), "a" : 2, "b" : 4, "c" : 5, "d" : 1 }
{ "_id" : ObjectId("4f156022ef7b8b0317a8ad19"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 }
你会告诉他们。然后在几秒钟之后又添加另一个:
>db.foo.insert( { "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 })
在30秒后查询时,可以使用最后显示的ObjectId(“4f156022ef7b8b0317a8ad19”):
> db.foo.find({_id : {$gt : ObjectId("4f156022ef7b8b0317a8ad19")}}).limit(10);
{ "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 }
>
这会很快执行,因为_id字段总是有一个索引。