ฟิลด์ค้นหา Mongoose ในอาร์เรย์ไม่ทำงาน

ฉันมีแอปพลิเคชันที่ทำงานใน Node.js และ mongodb โดยมีพังพอนเป็นไดรเวอร์ ฉันได้สร้างฟังก์ชันการเข้าสู่ระบบและเพื่อจุดประสงค์ในการแก้ไขจุดบกพร่อง ฉันจะพิมพ์เอกสารหลังจากการสอบถาม นี่คือรหัสของฉัน:

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

สาขา.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