具体问题
我在一棵树中设置了三个类
组所有者类:
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
具有特定origin_id
.