Поле поиска мангуста в массиве не работает

У меня есть приложение, работающее в Node.js и mongodb с mongoose в качестве драйвера. Я создал функцию входа в систему и только для целей отладки распечатываю документ после запроса. Вот мой код:

монгодб:

{
    "_id" : ObjectId("532cec102e42bcfced71fe03"),
    "admins" : [ 
        {
            "username" : "matthew",
            "name" : "lol",
            "hidden" : {
                "password" : "f8d822f6fab9dfc3c7b3a5035cdc422aee3bb838",
                "access" : true
            }
        }, 
        {
            "username" : "matthew1",
            "name" : "2000",
            "hidden" : {
                "password" : "40bd001563085fc35165329ea1ff5c5ecbdbbeef",
                "access" : false
            }
        }
    ],
    "location" : "SZ",
    "hidden" : {
        "global_access" : true
    },
    "token" : "f10e2821bbbea527ea02200352313bc059445190"
},
{
    "_id" : ObjectId("53307831a6b6ecd28c5cacd7"),
    "admins" : [ 
        {
            "username" : "matthew123123",
            "name" : "lol",
            "hidden" : {
                "password" : "f8d822f6fab9dfc3c7b3a5035cdc422aee3bb838",
                "access" : true
            }
        }, 
        {
            "username" : "matthew1222222",
            "name" : "2000",
            "hidden" : {
                "password" : "40bd001563085fc35165329ea1ff5c5ecbdbbeef",
                "access" : false
            }
        }
    ],
    "location" : "SH",
    "hidden" : {
        "global_access" : true
    },
    "token" : "f10e2821bbbea527ea02200352313bc159445190"
}

ветки.js

 var mongoose = require('mongoose');


 var db = mongoose.connection;
 var adminSchema = new mongoose.Schema({
    username: String,
    name: String,
    hidden: {
        password: String,
        access: Boolean
    }
 });

 var branchSchema = new mongoose.Schema({
    admins: [adminSchema],
    location: String,
    hidden: {
        global_access: Boolean
    },
    token: String
 });

 var branch = mongoose.model('branch', branchSchema);
 var admin = mongoose.model('admin', adminSchema);

 exports.login = function(req,res){
    var user = new admin(req.body, null, true)
    user.hidden.password = sha1(user.hidden.password);
    console.log(user);

    mongoose.connect('mongodb://localhost:27017/branches');
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function callback()
    {
        console.log('connected to database');
        branch.findOne({
        },
        {
            "admins": 
            {
                $elemMatch : 
                {
                    username: user.username, 
                    'hidden.password': user.hidden.password,
                }
            }
        })
        .exec(
        function (err,doc){
            db.close();
            res.send(doc);
        });
    });
 };

Я сделал запрос на отправку данных:

{
    username:'matthew',
    hidden.password:'200169+'
}

и он вернул результат:

{
    "_id": "532cec102e42bcfced71fe03",
    "admins": []
}

однако ожидалось, что я увижу примерно такой результат:

{
    "admins": [
        {
            "username":"matthew,
            "name":"lol"
        }
    ],
    "token":"f10e2821bbbea527ea02200352313bc059445190"
}

Я подозреваю, что запрос был неправильным, поскольку, если я отправлю любые случайные комбинации имени пользователя и пароля, он все равно даст тот же результат. Пожалуйста, помогите, спасибо!


person Community    schedule 24.03.2014    source источник


Ответы (1)


Возникла проблема с оператором findOne() в вашем коде. Синтаксис findOne():

db.collection.findOne(<criteria>, <projection>)

Если вы передаете пустой JSON критериям, это эквивалентно тому, что вы не указываете какие-либо критерии, и MongoDB возвращает первый документ в соответствии с естественный порядок документов на диске. Поскольку ваш запрос содержит пустой json в качестве критерия запроса и предоставляет только критерии проекции, MongoDB всегда возвращает первый документ на диске и применяет к нему критерии проекции. Поскольку возвращенный документ не соответствует проекции, вы получаете пустой массив.

Вы должны попробовать что-то вроде:

    ...
    branch.findOne({
        "admins": 
        {
            $elemMatch : 
            {
                username: user.username, 
                'hidden.password': user.hidden.password,
            }
        }
    },
    {"admins.$":1, token:1}
    )
    ...
person Anand Jayabalan    schedule 24.03.2014
comment
Спасибо за ваш ответ! однако я все еще получаю запись другого администратора (matthew1), возможно, это как-то связано с оператором проекции? - person ; 25.03.2014
comment
Я отредактировал сообщение, чтобы включить прогноз. Теперь вы должны увидеть ожидаемый результат. - person Anand Jayabalan; 25.03.2014