Как предотвратить запуск mongoid has_many запроса для нового объекта - PullRequest
0 голосов
/ 19 октября 2019

У меня есть два класса, A и B

class A
    include Mongoid::Document
    has_many :bs, class_name: "B"
end

class B
    include Mongoid::Document
    belongs_to :a
end

В консоли рельсов я набираю:

a = A.new

и возвращается

=> #<A _id: 5dab1f7780256231d1bb6da8, > 

Отлично, это новая запись, так что я знаю априори, что нет б, но когда я набираю:

a.bs

Он запускает запрос монго:

D, [2019-10-19T10:36:41.867215 #12753] DEBUG -- : MONGODB | Topology type 'unknown' initializing.
D, [2019-10-19T10:36:41.875124 #12753] DEBUG -- : MONGODB | Server localhost:27017 initializing.
D, [2019-10-19T10:36:41.878528 #12753] DEBUG -- : MONGODB | Topology type 'unknown' changed to type 'single'.
D, [2019-10-19T10:36:41.879335 #12753] DEBUG -- : MONGODB | Server description for localhost:27017 changed from 'unknown' to 'standalone'.
D, [2019-10-19T10:36:41.880055 #12753] DEBUG -- : MONGODB | There was a change in the members of the 'single' topology.
D, [2019-10-19T10:36:41.881797 #12753] DEBUG -- : MONGODB | localhost:27017 | test_development.find | STARTED | {"find"=>"bs", "filter"=>{"a_id"=>BSON::ObjectId('5dab1f7780256231d1bb6da8')}}
D, [2019-10-19T10:36:41.884234 #12753] DEBUG -- : MONGODB | localhost:27017 | test_development.find | SUCCEEDED | 0.001728129s

Этосводит с ума, есть ли способ предотвратить это? Я делаю это для миллионов записей и запускаю все эти ненужные запросы.

Спасибо за любую помощь, Кевин

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Mongoid на самом деле не может знать, что нет никаких B, связанных с вашим новым экземпляром A, потому что B хранит внешний ключ для A, а не наоборот. (См. Mongoid Принадлежит документации .) Похоже, ваша схема настроена не так, как вам нужно для эффективного выполнения этих запросов.

Вы можете добавить индексв поле a_id в схеме B, что ускорило бы выполнение этих запросов, или вы могли бы переработать свою схему так, чтобы внешний ключ как-то сохранялся в модели A.

0 голосов
/ 20 октября 2019

Существует сценарий использования поведения, которое вы испытываете:

class A
    include Mongoid::Document
    has_many :bs, class_name: "B"
end

class B
    include Mongoid::Document
    belongs_to :a
end

a = A.create!(id: 1, bs: [B.new])
a.destroy
aa = A.new(id: 1)
aa.bs
# => [#<B _id: 5dacc787026d7c52b820f0c1, a_id: 1>]

Скорее всего, вам потребуется настроить свой код, чтобы он не запрашивал ассоциацию, если вы не хотите, чтобы он был загружен. Например, если вы создаете экземпляры B, используйте B.new, предоставляя A, а не проходя через A.bs.

...