Mongoose Mongodb查询一组对象

当我使用Mongoose查询数组时,我正在努力获得我期望看到的结果。 用户可以拥有与他/她的账户相关联的许多房间。 房间对象存储在集合中的用户数组中。 只有一个集合称为用户。

考虑用户和房间的以下两个模式:

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

问题是这个查询似乎总是返回一个空的数组,即使它应该contiain的东西或如果它应该什么都不返回。 那么,我将如何search所有用户房间数组,以查看房间名称是否已经存在?

我也尝试了以下查询,但都不成功:

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

我还应该指出,数据库被填充,因为我可以看到在robomongo中的数组(其中有1个元素创build用户帐户创build)。

正在填充控制台输出到显示数据库的示例数据(包括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 / IicO3Az0WdkzlGh2xDcb8j1CF / FQhe5guZq”,“username”:“john”,“email”:“test2”,“rooms” {“name”:“john”,“ id”:ObjectId(“533c4ddab2c311a81be8a 259”)}],“status”:“active”},“_v ”:0}

我改变它使用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(); } });