在使用Mongoose查询数组时,我很难得到预期的结果.一个用户可以有许多与他/她的帐户关联的房间.房间对象存储在集合中与用户相连的数组中.只有一个名为"用户"的集合.

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

用户模式

var userSchema = mongoose.Schema({

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


});

房间模式

var roomSchema = mongoose.Schema({

     name: String

});

这是我try 过的问题:

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

        }

    });

问题是,这个查询似乎总是返回一个空数组,即使它应该包含一些内容或不应该返回任何内容.那么,我如何搜索所有用户的房间数组,以查看房间名称是否已经存在?

我也try 过以下方法来解决问题,但都不成功:

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中看到数组(在创建用户帐户时创建了一个元素).

控制台输出的示例数据显示正在填充数据库(包括user.rooms数组):

db.用户.查找()

推荐答案

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

        }

    });

Mongodb相关问答推荐

通过mongoDB中的查找从管道中删除被阻止的用户

如何限制/筛选子文档中的条目?

没有文档的MongoDB集合中的不一致,但当我执行count()时,它告诉我有15个文档

MongoDB:检测所有重叠事件(开始/结束日期)?

MongoDB 在一个聚合中包含多个组

将子元素的数组值提取到 mongodb 中的单个数组中?

在 MongoDB 中加入多个集合

$lookup 的参数必须是字符串

MongoDb c# driver LINQ vs Native 查询

从 node.js 的 mongodb 集合中删除文档

如何将 json 字符串编组到 bson 文档以写入 MongoDB?

Meteor 方法与deny/allow 规则

为什么 local.oplog.rs 上每隔几分钟的活动就会锁定 mongo 客户端

如何在 MongoDb 中使用杰克逊将日期字段存储为 ISODate()

Mongodb将重音字符匹配为基础字符

Mongoose:填充填充字段

try 解析序列化 JSON 字符串时处理 MongoDB 的 ISODate()

MongoDb:如何将附加对象插入对象集合?

在 MongoDB 中插入或更新许多文档

如何匹配 MongoDB 聚合框架中的 undefined值?