Encontrar subdocs em mongoose pela primeira vez pode parecer um pouco difícil ou apenas confuso. É por isso que decidi escrever isso.
Criando os esquemas
var likesSchema = new Schema({
username: 'string'
})
var statusSchema = new Schema({
text: 'string',
likes: [likesSchema]
})
var userSchema = new Schema({
username: 'string',
status: [statusSchema]
})
Como você pode ver, incorporamos likesSchema dentro do statusSchema, que é incorporado dentro do userSchema . O problema com os subdocs é que eles não são salvos individualmente, eles são salvos lá, o esquema pai é salvo, portanto, se você precisar usar os subdocs individualmente, essa pode não ser a abordagem certa para você.
Criação de alguns usuários, subdocs e subdocs.
var User = mongoose.model('User', userSchema);
var user = new User({
username: 'derp',
status: [{text: 'Hello world!'}]
})
var friend = new User({
username: 'goku',
status: [{text: 'Kamehameha!!!'}]
})
user.save(callback);
friend.save(callback);
Isso criará dois usuários. Depois vem a parte interessante: Consultar os subdocumentos, criá-los e modificá-los. Bem como com os sub-sub-docs
Consultando
//If you know the sub-doc position in the array it is pretty simple to query it
var subdoc = user.status[0];
console.log(subdoc.text); //This will output: Hello world!
//If you know its id it is also really simple
var subdoc = user.status.id(id); //where id is the sub-doc _id
/*
If you only know the text it is a little bit more complicated
*/
User.findOne({'status.text': 'Kamehameha!!!'}, function(err, the_user){
if(err)console.log(err)
if(the_user){
console.log(the_user.username); //goku
}
})
Adicionando sub-subdocumentos
subdoc.likes.push({
username: friend.username
})
subdoc.save(callback);
//It is really easy as pie!
Subdocumentos de consulta
É aqui que surgem problemas, porque não há realmente uma maneira de o mangusto questioná-los. Você pode usar a posição na matriz se souber disso, mas não pode realmente controlar isso.
Lembre-se de que é uma matriz, então você pode fazer isso para consultá-los:
for(i in subdoc.likes){
//username is the variable of the username of the like you want to find
if(likes[i].username == username){
//do something cool here
}
}
E é isso!