Há uma série de problemas aqui que você provavelmente está enfrentando.
Primeiro, teams é uma propriedade de array, mas você está atribuindo um objeto a ela. Você precisa fazer algo assim:
var user = new users({
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:[],
socialMedias: [{socialMediaType: socialMediaID}]
});
Segundo, se socialMediaType for passado como um parâmetro de função, você não poderá usá-lo como está fazendo. Você precisa fazer algo assim:
var socialMedias = {};
socialMedias[socialMediaType] = socialMediaID;
var user = new users({
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:[],
socialMedias: [socialMedias]
});
Terceiro, seu findOne não funcionará como está. Pelo que eu posso reunir da sua intenção aqui, você precisa de algo assim:
function searchUser(socialMediaID, socialMediaType){
var user
var query = {};
query["socialMedias."+socialMediaType] = socialMediaID;
users.findOne(query, function(err, userFound){
if(err) return handleError(err);
user = userFound;
});
//what does MongoDb return if it does not find the document?
return user;
}
Mas quarto, mesmo isso não funcionará porque você está retornando o usuário de forma síncrona de um método que executa uma operação assíncrona. Existem várias maneiras de resolver isso, mas você pode começar lendo sobre promessas ou passando uma função de retorno de chamada para searchUser.