我使用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正在缓存查询
答案 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({})
)。如果您需要销毁回调,则需要调查为什么您的代码显然只找到要删除的行,或者哪个回调正在中止其他现有行的删除。