Mongoose Mongodb查询一系列对象

Pau*_*lie 13 mongoose mongodb node.js

在使用Mongoose查询数组时,我正在努力获得我期望看到的内容.用户可以拥有与他/她的帐户相关联的许多房间.房间对象存储在集合中附加到用户的阵列中.只有一个名为users的集合.

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

USER SCHEMA

var userSchema = mongoose.Schema({

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


});
Run Code Online (Sandbox Code Playgroud)

ROOM SCHEMA

var roomSchema = mongoose.Schema({

     name: String

});
Run Code Online (Sandbox Code Playgroud)

这是我试过的查询:

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

        }

    });
Run Code Online (Sandbox Code Playgroud)

问题是这个查询似乎总是返回一个空数组,即使它应该包含某些东西,或者它应该什么都不返回.那么我如何搜索所有用户房间阵列以查看房间名称是否已存在?

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

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

}



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

}
Run Code Online (Sandbox Code Playgroud)

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

正在填充从控制台输出到show database的示例数据(包括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}

Pau*_*lie 21

我把它更改为使用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();

        }

    });
Run Code Online (Sandbox Code Playgroud)


小智 5

findOne返回单个文档,其中find返回一个游标。一旦你通过 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."})
        }

    });
Run Code Online (Sandbox Code Playgroud)