2013-02-22 58 views
1

我有一个使用expressjs和mongoosejs编写的web api。ExpressJS和MongooseJS:我可以查询子文档中的数组值吗?

该应用程序中的主模式包含一个子文档,permissions,其中包含数组字段。这些数组包含可以对该文档执行操作的用户的id。

我试图限制由read子文档数组字段中的值对集合的查询结果:

这里的主要架构:

var MainSchema = new Schema({ 
    uri: { type: String, required: false }, 
    user: { type: String, required: false }, 
    groups: [String],   
    tags: [String], 
    permissions: { 
     read: [String], 
     update: [String], 
     delete: [String] 
    } 
}); 

我想回到那个有文件permissions.read数组中的特定值或该数组为空的位置。

我的代码不会抛出错误,但不会限制结果;我仍然得到与给定值不匹配的文档,而且不是空的。

下面是我得到了什么:

var MainModel = mongoose.model('MainSchema', MainSchema); 

app.get('/api/search', function (req, res) { 
    var query = MainModel.find({'uri': req.query.uri }); 

    // This works fine 
    if (req.query.groups) { 
     query.where('groups').in(req.query.groups); 
    } 
    else if (req.query.user) { 
     query.where('user').equals(req.query.user); 
    } 

    // How can I return only documents that match req.query.user or ""? 
    query.where('permissions.read').in([req.query.user, ""]); 

    query.exec(function (err, results) { 
     if (!err) { 
     return res.send(results); 
     } else { 
     return console.log(err); 
     } 
    }); 
}); 

我有一种预感,在where子句不是测试每个permissions.read对每个传递给in数组值的元素的值条款。

谢谢。

EDIT:这里不应该被返回的文件,但是(注意,permissions.read阵列包括这不是当前用户的ID的值):

{ 
    "user": "[email protected]", 
    "uri": "http://localhost:3000/documents/test", 
    "permissions": { 
     "delete": [ 
     "[email protected]" 
     ], 
     "update": [ 
     "[email protected]" 
     ], 
     "read": [ 
     "[email protected]" 
     ] 
    }, 
    "tags": [], 
    "groups": [ 
     "demo", 
     "2013" 
    ] 
} 

EDITED:校正模型/模式混淆,这不在我的代码中,但被复制/粘贴。谢谢。

+0

你是指一个空数组('permissions:[]')还是一个包含空字符串的数组('permissions:['']')?你能编辑你的问题来包含一个正在被返回的示例文档吗? – JohnnyHK 2013-02-22 21:24:27

+0

@JohnnyHK done - 注意权限subdoc模式,这是我认为我没有正确处理 - 它是一个subdoc,每个字段都是一个字符串数组。这些字符串是我想测试的可接受值。谢谢。 – Jamie 2013-02-22 22:11:49

+0

我假设你重新指定'MainSchema'来引用模型而不是模式?除此之外,这一切看起来很好,不幸的是我不能重现该文档的问题。除非设置'req.query.user =“[email protected]”',否则结果会被忽略。 – JohnnyHK 2013-02-22 22:27:21

回答

3

我找过并没有找到一个mongodb/mongoose查询的例子,用于测试子文档数组字段或空数组字段中的指定值。

取而代之,因为我控制了API(来自此代码)和客户端应用程序,所以我重构了它。您的投入,@JohnnyHK

if (req.query.mode === 'user') { 
    query.where('user').equals(req.query.user); 
} 
else if (req.query.mode === 'group') { 
    query.where('groups').in(req.query.groups); 
    query.$where('this.permissions.read.length === 0'); 
} 
else if (req.query.mode === 'class') { 
    query.$where('this.permissions.read.length === 0'); 
} 

感谢:

我现在加三个where子句来查询,基于客户端用户的选择之一。

相关问题