bounty将在2天后过期。回答此问题可获得+50的声望奖励。Samy Kacimi正在寻找规范答案。
我在ORM中使用Ruby On Rails和Mongoid。
我有一个User
类和一个Document
类,用户有_many个文档,一个文档有一个类别,有多个类别,但是有些是强制的。
我要检索以下所有用户:
- 缺少某个强制类别中的文档
- 或者根本没有文档的用户
以下是我目前为止对聚合所做的尝试,但这并不奏效:
def self.without_all_required_documents
subquery = Document.collection.aggregate([
{ "$match" => { "user_id" => { "$ne" => nil }, "category" => { "$in" => required_categories } } },
{ "$group" => { "_id" => "$user_id", "categories" => { "$addToSet" => "$category" } } },
{ "$project" => { "_id" => 1, "missing_categories" => { "$setDifference" => [required_categories, "$categories"] } } },
{ "$match" => { "missing_categories" => { "$ne" => [] } } },
{ "$project" => { "_id" => 1 } }
])
where(
:"$or" => [
{ :id.in => subquery.map { |doc| doc["_id"] } },
{ :"$and" => required_categories.map { |cat| { :"documents.category" => cat } } },
{ :"$expr" => { :"$eq" => [{ :"$size" => { :"$ifNull" => ["$documents", []] } }, 0] } }
]
)
end
我得到了有文档的记录,有所有必需文档的记录,没有没有文档的记录。
1条答案
按热度按时间rnmwe5a21#
要检索缺少某个强制类别中的文档的所有用户或根本没有文档的用户,可以使用以下查询:
下面是它的工作原理:
注意,您需要将“mandatory_category1”和“mandatory_category2”替换为强制类别的实际名称。