2014-04-02 63 views
4

我正在努力獲得使用Mongoose查詢數組時所期望看到的內容。用戶可以有多個與他/她的帳戶關聯的房間。房間對象存儲在集合中附屬於用戶的數組中。只有一個稱爲用戶的集合。Mongoose Mongodb查詢對象數組

考慮以下兩個模式供用戶和房間:

用戶架構

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

     } 

    }); 

問題是這個查詢似乎總是返回一個空的數組,即使它應該contiain的東西或者它應該什麼都不返回。那麼,我將如何搜索所有用戶房間數組,以查看房間名稱是否已存在?

我也曾嘗試以下的查詢,但既不是成功的:

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個元件)在robomongo。從控制檯輸出

樣品的數據顯示數據庫被填充(包括user.rooms陣列):

db.users.find() { 「_id」:的ObjectId( 「533c4db2b2c311a81be8a256」),「本地「:{」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

數據在mongo shell的「用戶」集合中的實際外觀如何?我還發現模式定義存在一些問題,如果數據在一個或兩個集合中,則不會清楚說明。你可以添加這個到你的問題。 –

+0

您對Schema Neil Lunn有什麼問題?數據全部集中在一個集合中。 – 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(); 

     } 

    });