具体的な問題
ツリーに3つのクラスを設定しています
グループ所有者クラス:
class GroupOwner
include Mongoid::Document
field :origin_id, type: BSON::ObjectId
field :origin_type, type: String
embeds_many :groups
end
グループクラス:
class Group
include Mongoid::Document
field :slug, type: String
embedded_in :owner, class_name: "GroupOwner"
embeds_many :members, class_name: "GroupMember"
end
グループ メンバー クラス:
class GroupMember
include Mongoid::Document
field :origin_id, type: BSON::ObjectId
field :origin_type, type: String
embedded_in :group
end
そして、私がやりたいのは、特定のスラッグを持つGroupsすべてのように、指定された基準を満たすすべてのものを取得することです。Groupsそれらがどれに埋め込まれているかは気にしませんGroupOwner。すべてが必要です。そして、私がそれらを持っているとき、私はGroupMembers別の基準のセットを満たすそれらの中にすべてが欲しい.
それらは埋め込みの外には存在しないため、Group.where()明らかに機能しません。私がこれまでに行った最も遠いものは次のとおりです。
GroupOwner.elem_match(groups: {slug: 'friends'}).map(&:groups).flattenしかし、Ruby を使用して実際に値をマッピングするため、このソリューションは嫌いです。Queryable.pluckメソッドは Mongoid で使用できますが、mongo ドキュメントを非常に激しく抽出するため、Ruby ではオブジェクトではなくなり、ハッシュになります。
すべてのモデル オブジェクトをマップした場合でもGroup、どういうわけか次のようになります。
groups = GroupOwner.elem_match(groups: {slug: 'friends'}).map(&:groups).flatten
groups.elem_match(members: {origin_id: value})
...要素をまったく返しません。elem_matchルート ドキュメント以外の場所で作業を停止することにしたかのように。
非常に一般的な問題
これはすべて、私が抱えていると思われるより一般的な問題に対する精巧なアプローチです。特定の値のセットを持つ子ドキュメントを検索および/または削除します。
つまり、私がやろうとしてGroupMemberいるのは、特定の.xmlを持つすべてのドキュメントを削除することだけですorigin_id.