Bidang pencarian luwak dalam array tidak berfungsi

Saya memiliki aplikasi yang berjalan di Node.js dan mongodb dengan luwak sebagai drivernya. Saya telah membuat fungsi login dan hanya untuk tujuan debugging, saya mencetak dokumen setelah menanyakan. Ini kode saya:

mongodb:

{
    "_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"
}

cabang.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);
        });
    });
 };

Saya membuat permintaan mengirimkan data:

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

dan itu mengembalikan hasilnya:

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

namun, saya diharapkan melihat hasilnya seperti ini:

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

Saya curiga permintaannya salah, karena jika saya mengirimkan kombinasi nama pengguna dan kata sandi secara acak, hasilnya tetap sama. Tolong bantu, terima kasih!


person Community    schedule 24.03.2014    source sumber


Jawaban (1)


Ada masalah dengan pernyataan findOne() di kode Anda. Sintaks dari findOne() adalah:

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

Jika Anda meneruskan JSON kosong ke kriteria, itu sama dengan tidak menentukan kriteria apa pun dan MongoDB mengembalikan dokumen pertama sesuai dengan urutan alami dokumen pada disk. Karena kueri Anda berisi json kosong sebagai kriteria kueri dan hanya menyediakan kriteria proyeksi, MongoDB selalu mengembalikan dokumen pertama pada disk dan menerapkan kriteria proyeksi di dalamnya. Karena dokumen yang dikembalikan tidak sesuai dengan proyeksi, Anda mendapatkan array kosong.

Anda harus mencoba sesuatu seperti:

    ...
    branch.findOne({
        "admins": 
        {
            $elemMatch : 
            {
                username: user.username, 
                'hidden.password': user.hidden.password,
            }
        }
    },
    {"admins.$":1, token:1}
    )
    ...
person Anand Jayabalan    schedule 24.03.2014
comment
Terima kasih atas jawaban Anda! namun saya masih mendapatkan entri admin lain (matthew1), apakah ini mungkin ada hubungannya dengan pernyataan proyeksi? - person ; 25.03.2014
comment
Saya telah mengedit postingan untuk memasukkan proyeksi. Anda akan melihat hasil yang diharapkan sekarang. - person Anand Jayabalan; 25.03.2014