我在 ORM 中使用 Ruby On Rails 和 Mongoid。
我有一个
User
班和一个Document
班。用户有_很多文件。文档有一个类别。
有多个类别,但其中一些是强制性的。
我想检索在强制类别之一中缺少文档的所有用户,或者根本没有文档的用户。到目前为止,这是我对聚合所做的尝试,但这不起作用:
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