Mongodb:断言数组中的所有元素都有一个不为空的字段

Mongodb: assert that all elements in an array have a field not null

给定一个包含这样文档的集合:

任务收集文件

[
{
 "_id"=>BSON::ObjectId('54d674b64d42504b6a000000'), 
 "submissions"=>
  [{"_id"=>BSON::ObjectId('54d674b64d42504b6a010000'),    
    "grade"=>nil,    
    "user_id"=>BSON::ObjectId('54d1e2454d42503069060000')},
   {"_id"=>BSON::ObjectId('54d674b64d42504b6a020000'),       
    "grade"=>nil,            
    "user_id"=>BSON::ObjectId('54d1e2454d42503069070000')},
   {"_id"=>BSON::ObjectId('54d674b64d42504b6a030000'),    
    "grade"=>nil,    
    "user_id"=>BSON::ObjectId('54d1e2454d42503069080000')}
   ],
 },
{
 "_id"=>BSON::ObjectId('54d674b64d42504b6a100000'), 
 "submissions"=>
  [{"_id"=>BSON::ObjectId('54d674b64d42504b6a010000'),    
    "grade"=>5,    
    "user_id"=>BSON::ObjectId('54d1e2454d42503069060000')},
   {"_id"=>BSON::ObjectId('54d674b64d42504b6a020000'),       
    "grade"=>7,            
    "user_id"=>BSON::ObjectId('54d1e2454d42503069070000')},
   {"_id"=>BSON::ObjectId('54d674b64d42504b6a030000'),    
    "grade"=>nil,    
    "user_id"=>BSON::ObjectId('54d1e2454d42503069080000')}
   ],
 },
{
 "_id"=>BSON::ObjectId('54d674b64d42509b6a000000'), 
 "submissions"=>
  [{"_id"=>BSON::ObjectId('54d674b64d42504b6a010000'),    
    "grade"=>8,    
    "user_id"=>BSON::ObjectId('54d1e2454d42503069060000')},
   {"_id"=>BSON::ObjectId('54d674b64d42504b6a020000'),       
    "grade"=>7,            
    "user_id"=>BSON::ObjectId('54d1e2454d42503069070000')},
   {"_id"=>BSON::ObjectId('54d674b64d42504b6a030000'),    
    "grade"=>6,    
    "user_id"=>BSON::ObjectId('54d1e2454d42503069080000')}
   ],
 }
]

如何获取所有 submissions 数组不包含 nil 成绩的任务文档?

示例中的结果将只包含最后一个。

我正在使用 Mongoid,但我也欢迎纯 Mongodb 查询。

使用elem_match和负比较:

Task.where(:submissions.elem_match => { :grade.ne => nil })