我有一个使用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:校正模型/模式混淆,这不在我的代码中,但被复制/粘贴。谢谢。
你是指一个空数组('permissions:[]')还是一个包含空字符串的数组('permissions:['']')?你能编辑你的问题来包含一个正在被返回的示例文档吗? – JohnnyHK 2013-02-22 21:24:27
@JohnnyHK done - 注意权限subdoc模式,这是我认为我没有正确处理 - 它是一个subdoc,每个字段都是一个字符串数组。这些字符串是我想测试的可接受值。谢谢。 – Jamie 2013-02-22 22:11:49
我假设你重新指定'MainSchema'来引用模型而不是模式?除此之外,这一切看起来很好,不幸的是我不能重现该文档的问题。除非设置'req.query.user =“[email protected]”',否则结果会被忽略。 – JohnnyHK 2013-02-22 22:27:21