Também tenho procurado essa resposta e não tenho certeza se gosto de acessar o último documento da matriz. Eu tenho uma solução alternativa, no entanto. O método
m['b'].push
retornará um inteiro, 1 ou 0 - estou assumindo que é baseado no sucesso do push (em termos de validação). No entanto, para obter acesso ao subdocumento, e particularmente ao _id do subdocumento - você deve usar o create
método primeiro, depois push
. O código é o seguinte:
var subdoc = m['b'].create({ ba: 234, bb: "World" });
m['b'].push(subdoc);
console.log(subdoc._id);
m.save(function(err, model) { console.log(arguments); });
O que está acontecendo é que quando você passa o objeto para o método push ou create, a conversão do Schema ocorre imediatamente (incluindo coisas como validação e conversão de tipo) - isso significa que este é o momento em que o ObjectId é criado; não quando o modelo é salvo no Mongo. Na verdade, o mongo não atribui automaticamente valores _id a subdocumentos, este é um recurso do mongoose. A criação do Mongoose está documentada aqui:create docs
Você também deve observar, portanto, que mesmo que você tenha um subdocumento _id - ele ainda não está no Mongo até que você o salve, então fique cansado de qualquer ação DOCRef que você possa tomar.