0

具体的な問題

ツリーに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.

4

1 に答える 1

1

Group を独自のコレクションに配置する必要があるかもしれません。私がmongodb docsで読んだことについては、これが好ましい方法です。グループ所有者を照会するときに、すべてのグループとメンバーを取得する必要がなくなり、グループのグループ所有者を簡単に変更できるようになりました。mongodb はスキーマ フリーですが、アプリでスキーマを定義し、SQL の正規化のような厳密な規則に従う必要がないため、埋め込みと関連付けを選択する際は慎重に検討する必要があります。

mongodb では、結合がないためデータが複製されてしまうため、グループ ドキュメント内にグループ所有者データ (所有者名など) が必要になる場合があります。

于 2013-06-09T23:39:51.647 に答える