2014-04-02 5 views
4

Я изо всех сил пытаюсь получить то, что я ожидаю увидеть при запросе массива с использованием Mongoose. Пользователь может иметь много комнат, связанных с его/ее учетной записью. Объекты комнаты хранятся в массиве, прикрепленном к пользователю в коллекции. Существует только одна коллекция, называемая пользователями.Mongoose Mongodb, запрашивающий массив объектов

Рассмотрим следующие две схемы для пользователя и комнаты:

USER SCHEMA

var userSchema = mongoose.Schema({ 

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


}); 

ROOM SCHEMA

var roomSchema = mongoose.Schema({ 

    name: String 

}); 

Это запрос, я попытался:

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(); 

     } 

    }); 

Проблема заключается в том, что этот запрос всегда возвращает пустой массив, даже если он должен что-то переписывать или если он ничего не должен возвращать. Итак, как бы я искал все массивы комнат пользователей, чтобы узнать, существует ли название комнаты?

Я также попытался следующие на вопросы, но ни успешны:

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

} 



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

} 

Я хотел бы также отметить, что база данных заполняется, как я могу видеть массив (который имеет 1 элемент, созданный при создании учетной записи пользователя) в робомонго.

Выборочные данные из консольного вывода для отображения базы данных заселяется (включая user.rooms массив):

db.users.find() { "_id": ObjectId ("533c4db2b2c311a81be8a256"), " local ": {" password ":" $ 2a $ 08 $ 0yQQJ2y0726kZtkWY5mAPOgZhacOmZn0Fd8DlausiuMB XE4ZblTXS "," username ":" paul "," email ":" test "," rooms ": [{" name ":" paul "," id ": ObjectId (" 533c4db2b2c311a81be8a2 57 ")}]," status ":" active "}," _v ": 0} {" _id ": ObjectId (" 533c4ddab2c311a81be8a258 ")," local ": {" password ":" $ 2a $ 08 $ dC3CbDTkG5ozECDTu/IicO3 Az0WdkzlGh2xDcb8j1CF/ FQhe5guZq "," username ":" john "," email ":" test2 "," rooms ": [{" name ":" john "," id ": ObjectId (" 533c4ddab2c311a81be8a 259 ")} ], "статус": "активный"}, " _v": 0}

+0

Каковы фактические данные в вашей коллекции «пользователей» из оболочки монго? Я также вижу некоторые проблемы с вашим определением схемы, и вы не даете понять, находятся ли данные в одной коллекции или два. Вы можете добавить это к своему вопросу. –

+0

Какие проблемы вы видите в моей схеме Нейл Лунн? Все данные находятся в одной коллекции. – Paulie

+1

Другие вопросы были более важными, поэтому это поможет, если вы сможете редактировать. То, что я имел в виду здесь, было то, что «roomSchema», похоже, не используется. На него обычно ссылаются в «userSchema». Но самое главное, что нам нужно увидеть, это некоторые из ваших данных. –

ответ

10

Я изменил его использовать findOne вместо поиска и он работает сейчас. Я не слишком уверен, почему это должно иметь значение. Это функция findOne, которую я использовал:

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

     if (err){ 
      return done(err); 
     }  

     if (user) { 
      console.log("ROOM NAME FOUND"); 
      req.roomNameAlreadyInUse = true; 
      next(); 

     } else { 
      req.roomNameAlreadyInUse = false; 
      console.log("ROOM NAME NOT FOUND"); 
      next(); 

     } 

    }); 
Смежные вопросы