mongoid destroy_all后跟count计算结果缓存结果

时间:2012-05-09 08:30:51

标签: mongodb mongoid

我使用MongoId阅读question我理解的Mongoid

的给定答案

不会缓存任何查询

现在运行以下查询

  

PartPriceRecord.destroy_all

     

PartPriceRecord.count()      ==> 31721

怎么可能我只删除所有记录,这让我觉得mongo正在缓存某些查询

在我的mongoid查询日志中,我可以看到每个删除两个查询操作

MONGODB (0ms) decisiv_staging['system.indexes'].insert([{:name=>"part_number_1", :ns=>"decisiv_staging.part_price_records", :key=>{"part_number"=>1}, :unique=>true}])
MONGODB (0ms) decisiv_staging['part_price_records'].remove({:_id=>BSON::ObjectId('4fa39b35edd7f4306b0042bf')})

表示已创建索引并删除记录。

那么mongo如何缓存查询是否有任何方法可以从mongoid清除mongo缓存 如果mongo正在缓存查询

1 个答案:

答案 0 :(得分:1)

警告:我不是一个mongoid用户。

  

那么mongo如何缓存查询

Mongo本身不会像那样进行任何缓存。

如果查看在db上执行的查询:

$ mongodb viren
> db.setProfilingLevel(0); 
> db.system.profile.drop();  
> db.setProfilingLevel(2);

然后执行你的代码,你会在日志中看到这样的东西:

> db.system.profile.find()
{ "ts" : ISODate("2012-05-09T08:39:21.657Z"), "op" : "insert", "ns" : "viren.part_price_records", "millis" : 0, "client" : "127.0.0.1", "user" : "" }
{ "ts" : ISODate("2012-05-09T08:39:26.553Z"), "op" : "remove", "ns" : "viern.part_price_records", "query" : { }, "millis" : 0, "client" : "127.0.0.1", "user" : "" }

直接查看数据库将使您能够准确了解/了解发出的查询以及是否存在缓存 - 它在哪里(它不在数据库本身中)。

但是,您在问题中显示的查询日志上方的差异是.remove({:_id=>BSON::ObjectId('4fa39b35edd7f4306b0042bf')})最多会删除一个对象,条件上面({})会截断集合。

查看destroy all的文档,它会在每个已删除的行上运行回调 - 这可能意味着它一次删除一行(具有30k行将占用大量时间)。您可以使用delete all,它会(我假设)直接发出查询以删除所有行(db.part_price_records.remove({}))。如果您需要销毁回调,则需要调查为什么您的代码显然只找到要删除的行,或者哪个回调正在中止其他现有行的删除。