You need to aggregate the result, as below:
Unwind the names array. 
Sort the records based on comments.names.number in descending
order. 
Group the records based on the _id field. 
project the required structure. 
Code:
 db.collection.aggregate([
 {$unwind:"$comments.names"},
 {$sort:{"comments.names.number":-1}},
 {$group:{"_id":"$_id",
          "var1":{$first:"$var1"},
          "var2":{$first:"$var2"},
          "var3":{$first:"$var3"},
          "field":{$first:"$comments.field"},
          "names":{$push:"$comments.names"}}},
 {$project:{"comments":{"names":"$names","field":"$field"},"var1":1,
            "var2":1,"var3":1}}  
 ],{"allowDiskUse":true})
If your collection is large, you might want to add a $match criteria in the beginning of the aggregation pipeline to filter records or use (allowDiskUse:true), to facilitate sorting large number of records.
 db.collection.aggregate([
 {$match:{"_id":someId}},
 {$unwind:"$comments.names"},
 {$sort:{"comments.names.number":-1}},
 {$group:{"_id":"$_id",
          "var1":{$first:"$var1"},
          "var2":{$first:"$var2"},
          "var3":{$first:"$var3"},
          "field":{$first:"$comments.field"},
          "names":{$push:"$comments.names"}}},
 {$project:{"comments":{"names":"$names","field":"$field"},"var1":1,
            "var2":1,"var3":1}}  
 ])
What The below query does:
db.collection.find().sort( { "comments.names.number": -1 } )
is to find all the documents, then sort those documents based on the number field in descending order. What this actually does is for each document get the comments.names.number field value which is the largest, for each document. And then sort the parent documents based on this number. It doesn't manipulate the names array inside each parent document.