繁体   English   中英

Mongoose Mongodb查询对象数组

[英]Mongoose Mongodb querying an array of objects

我正在努力获得使用Mongoose查询数组时期望看到的内容。 用户可以拥有许多与其帐户关联的房间。 房间对象存储在集合中附加到用户的数组中。 只有一个集合称为用户。

考虑用户和房间的以下两个架构:

用户模式

var userSchema = mongoose.Schema({

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


});

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) {

}

我还应该指出,该数据库已填充,因为我可以在robomongo中看到该数组(在创建用户帐户时创建了1个元素)。

来自控制台输出以显示数据库的示例数据(包括user.rooms数组):

db.users.find(){“ _id”:ObjectId(“ 533c4db2b2c311a81be8a256”),“ local”:{“ password”:“ $ 2a $ 08 $ 0yQQJ2y0726kZtkWY5mAPOgZhacOmZn0Fd8DlausiuMB XE4ZblTXS”,“测试”,“房间”:[{“名称”:“保罗”,“ id”:ObjectId(“ 533c4db2b2c311a81be8a2 57”)}],“状态”:“有效”},“ _ v”:0} {“ _id” :ObjectId(“ 533c4ddab2c311a81be8a258”),“ local”:{“密码”:“ $ 2a $ 08 $ dC3CbDTkG5ozECDTu / IicO3Az0WdkzlGh2xDcb8j1CF / FQhe5guZq”,“用户名”:“”“,”“ {“ name”:“ john”,“ id”:ObjectId(“ 533c4ddab2c311a81be8a 259”)}],“ status”:“活动”},“ _v”:0}

我将其更改为使用findOne而不是find,并且现在可以使用。 我不太确定为什么这会有所作为。 这是我使用的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();

        }

    });

findOne返回一个文档, find返回一个游标。 一旦找到了光标,您就结束了,没有更多的文档了。

User.findOne({'local.rooms': {$elemMatch: {name: req.body.username}}}, (err,UserInfo) => {

        if (err){
            return res.status(400).json({Error:"Something went wrong please try again"})
        }    

        if (UserInfo) {
            console.log("ROOM NAME FOUND");
            req.roomNameAlreadyInUse = true;
            res.json({msg:"Room name found.",userData:UserInfo})

        } else {
            req.roomNameAlreadyInUse = false;
            console.log("ROOM NAME NOT FOUND");
            res.json({msg:"Room name not found."})
        }

    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM