1

我使用 MongoId 阅读我理解的问题的给定答案 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 正在缓存查询

4

1 回答 1

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

于 2012-05-09T08:48:06.600 回答