Consultando subdocumentos e subdocumentos no Mongoose

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!