【问题标题】:Query over an array in mongoose returns empty array查询 mongoose 中的数组返回空数组
【发布时间】:2019-11-30 00:49:25
【问题描述】:

我有一个菜单模型,它有一个可以访问它的成员(角色)列表。当我尝试基于角色进行查询时,猫鼬返回空数组。在创建模式之前,我在猫鼬终端中创建并填充了菜单集合。当我在终端执行查询时,它会返回正确的记录。请帮忙。

const MenuSchema = mongoose.Schema({
    menuId:{type:Number},
    menuName:{type:String},
    path:{type:String},
    accessTo:[{type:String}]
});

const Menu = module.exports = mongoose.model('Menu', MenuSchema);

module.exports.getMenuByRole = function(role, callback){

        console.log('rle'+role);
         const query = {"accessTo": role};
        Menu.find(query,callback);
    //   Menu.find(query, callback);

}

这是终端执行的结果:

 db.Menu.find({"accessTo":"admin"})

{ "_id" : ObjectId("5d352f6c866e313fca373d1d"), "menuId" : 2, "menuName" : "Profile", "path" : "/profile", "accessTo" : [ "admin", "employees", "user" ] }

{ "_id" : ObjectId("5d352f73866e313fca373d1e"), "menuId" : 3, "menuName" : "Employees", "path" : "/employess", "accessTo" : [ "admin" ] }

【问题讨论】:

    标签: arrays node.js mongoose


    【解决方案1】:

    您必须将 .exec() 与 find 一起使用。 而且,accessTo 是一个数组字段,你必须使用 $in 来处理它。

    const mongoose = require("mongoose")
    const Schema = mongoose.Schema
    mongoose.connect('mongodb://localhost:27017/stackoverflow', {useNewUrlParser: true});
    
    const MenuSchema = new Schema({
        menuId:{type:Number},
        menuName:{type:String},
        path:{type:String},
        accessTo:[{type:String}]
    });
    
    const menuModel = mongoose.model("Menu", MenuSchema)
    
    function run(role){
        menuModel
        .find({ 
            accessTo: {
                $in: [role]
            } 
        })
        .exec((err, result) => {
            console.log("result", result)
        }, err => {
            console.log("err", err)
        }) 
    }
    
    run("admin")
    

    【讨论】:

    • 它返回相同的结果。它是 [ ]。
    • 你在db中插入数据了吗? @sreeyachowdary。我已经编辑了代码,你使用了修改后的副本吗?
    • 更改数据库url,我在示例中使用。到您自己的数据库的网址。 @sreeachowdary
    • 实际上我使用 mongo shell 将记录插入到“菜单”中,但是我正在查询“菜单”,这是我们创建模式时代码创建的。所以我删除了我创建并运行代码的“菜单”。它创建了菜单并解决了问题。我会将您的答案标记为正确,因为它解决了我的其他问题。
    • 谢谢。赞成票也将不胜感激。 @sreeachowdary
    猜你喜欢
    • 2018-06-12
    • 2015-04-18
    • 1970-01-01
    • 2023-04-03
    • 2014-10-21
    • 2017-11-13
    • 1970-01-01
    • 2013-12-17
    • 2015-08-16
    相关资源
    最近更新 更多