Mangouste Mongodb interrogation d'un tableau d'objets

J'ai du mal à obtenir ce que je m'attends à voir lors de l'interrogation d'un tableau à l'aide de la Mangouste. Un utilisateur peut avoir plusieurs chambres associées à son compte. Les objets de la pièce sont stockées dans un tableau joint à l'utilisateur dans la collection. Il y a seulement une collection appelée utilisateurs.

Considérer les deux Schémas pour l'utilisateur et de chambre:

UTILISATEUR DE SCHÉMA

var userSchema = mongoose.Schema({

local            : {
    username     : String,
    email        : String,
    password     : String,
    rooms        : {type:Array, default: []}
}  


});

SALLE DE SCHÉMA

var roomSchema = mongoose.Schema({

     name: String

});

C'est la requête que j'ai essayé:

var User = require('../models/user');
User.find({ 'rooms.name' : req.body.username  }, 
{ rooms: 
{ $elemMatch : 
{ 
name: req.body.username 
} 
} 
}, function (err, user) {
if (err){
return done(err);
}    
console.log("user:::", user);
if (user) {
console.log("ROOM NAME FOUND");
req.roomNameAlreadyInUse = true;
next();
} else {
req.roomNameAlreadyInUse = false;
console.log("ROOM NAME NOT FOUND");
next();
}
});

Le problème est que cette requête semble toujours renvoyer un tableau vide, même si elle doit contiain quelque chose ou si elle doit retourner rien. Alors, comment aurais-je recherche par le biais de tous les utilisateurs de la salle des tableaux pour voir si le nom de la pièce existe déjà?

J'ai aussi essayé la suite de requêtes, mais pas plus de succès:

User.find({local: {rooms: {$elemMatch: {name: req.body.username}}}}, function (err,     user) {
}
User.find({'local.rooms': {$elemMatch: {name: req.body.username}}}, function (err, user) {
}

Je dois également souligner que la base de données est remplie que je puisse voir le tableau (qui a 1 élément créé sur la création de compte utilisateur) dans robomongo.

Des données de l'échantillon de sortie de la console pour afficher la base de données est remplie (y compris de l'utilisateur.chambres array):

db.les utilisateurs.find()
{ "_id" : ObjectId("533c4db2b2c311a81be8a256"), "local" : { "mot de passe" : "$2a$08$0yQQJ2y0726kZtkWY5mAPOgZhacOmZn0fd8dlausiumb
XE4ZblTXS", "nom" : "paul", "email" : "", "rooms" : [ { "name" : "paul", "id" : ObjectId("533c4db2b2c311a81be8a2
57") } ], "statut" : "active" }, "
_v" : 0 }
{ "_id" : ObjectId("533c4ddab2c311a81be8a258"), "local" : { "mot de passe" : "$2a$08$dC3CbDTkG5ozECDTu/IicO3Az0WdkzlGh2xDcb8j1CF/
FQhe5guZq", "nom" : "jean", "email" : "test2", "rooms" : [ { "nom" : "jean", "id" : ObjectId("533c4ddab2c311a81be8a
259") } ], "statut" : "active" }, "
_v" : 0 }

De quoi les données sont réellement ressembler dans votre "utilisateurs" de la collection depuis le shell mongo? Je vois aussi quelques problèmes avec votre définition de schéma et vous ne faites pas clairement si les données sont dans une collection ou deux. Vous pouvez ajouter ceci à votre question.
Quels problèmes avez-vous voir avec mon Schéma Neil Lunn? Les données sont toutes dans une seule collection.
Les autres questions étaient plus importantes, de sorte qu'il serait utile que vous pouvez modifier. Ce que je faisais référence ici, mais a été que "roomSchema" ne semble pas être utilisés. Il devrait normalement être référencée dans "userSchema". Mais la chose la plus importante nous avons besoin de voir certains de vos données.
Lunn, j'ai ajouté quelques infos. J'ai aussi changé le trouver appel à findOne qui fonctionne maintenant (voir ma réponse ci-dessous.) Le roomSchema est utilisé lorsqu'un utilisateur crée son compte. J'ai essayé d'ajouter les salles de schéma à l'intérieur de la utilisateurs du schéma de la matrice de quelque chose de ce genre - de la chambre: [roomSchema]. Mais je ne pouvais pas obtenir que cela fonctionne. Il fait sens pour moi la façon dont je le fais maintenant, c'est à dire lorsqu'un utilisateur crée son compte un modèle d'utilisateur et un modèle de la salle sont créés et le modèle de la salle est ensuite insérée dans le modèle de l'utilisateur. Je ne suis pas sûr si c'est la meilleure façon, ou si elle l'encontre de meilleure pratique, mais il semble fonctionner.

OriginalL'auteur Paulie | 2014-04-02