0

具体问题

我在一棵树中设置了三个类

组所有者类:

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.

4

1 回答 1

1

也许您应该将 Group 放在自己的集合中。对于我在 mongodb 文档上阅读的内容,这是首选方式。您可以更轻松地查询,在查询群组所有者时不必获取所有群组和成员,现在您可以轻松更改群组的群组所有者。尽管 mongodb 是无模式的,但您在应用程序上定义了模式,并且没有像 SQL 规范化这样的严格规则要遵循,因此在选择嵌入与关联时,您需要仔细考虑。

在 mongodb 上,您最终会复制数据,因为您没有连接,因此您可能希望在组文档中包含组所有者数据,例如所有者名称。

于 2013-06-09T23:39:51.647 回答