lib/mongoid/selectable.rb
# frozen_string_literal: true
# rubocop:todo all
module Mongoid
# Provides behavior for generating the selector for a specific document.
module Selectable
extend ActiveSupport::Concern
# Get the atomic selector for the document. This is a hash in the simplest
# case { "_id" => id }, but can become more complex for embedded documents
# and documents that use a shard key.
#
# @example Get the document's atomic selector.
# document.atomic_selector
#
# @return [ Hash ] The document's selector.
def atomic_selector
embedded? ? embedded_atomic_selector : root_atomic_selector_in_db
end
private
# Get the atomic selector for an embedded document.
#
# @api private
#
# @example Get the embedded atomic selector.
# document.embedded_atomic_selector
#
# @return [ Hash ] The embedded document selector.
def embedded_atomic_selector
if persisted? && _id_changed?
_parent.atomic_selector
else
_parent.atomic_selector.merge("#{atomic_path}._id" => _id)
end
end
# Get the atomic selector that would match the existing version of the
# root document.
#
# @api private
#
# @return [ Hash ] The root document selector.
def root_atomic_selector_in_db
{ "_id" => _id }.merge!(shard_key_selector_in_db)
end
end
end