【发布时间】:2013-02-27 05:19:24
【问题描述】:
我有一个使用 expressjs 和 mongoosejs 编写的 web api。
应用程序中的主架构包含一个子文档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 子句没有针对传递给 in 子句的数组的每个值来测试 permissions.read 的每个元素的值。
谢谢。
编辑:这是一个不应返回的文档,但它是(注意,permissions.read 数组包含一个不是当前用户 ID 的值):
{
"user": "firstname@gmail.com",
"uri": "http://localhost:3000/documents/test",
"permissions": {
"delete": [
"firstname@gmail.com"
],
"update": [
"firstname@gmail.com"
],
"read": [
"firstname@gmail.com"
]
},
"tags": [],
"groups": [
"demo",
"2013"
]
}
已编辑:更正了模型/架构混淆,这不在我的代码中,但在复制/粘贴中被遗漏了。谢谢。
【问题讨论】:
-
您是指空数组 (
permissions: []) 还是包含空字符串的数组 (permissions: [''])?您能否编辑您的问题以包含一个不应该返回的示例文档? -
@JohnnyHK 完成——注意权限子文档架构,我认为我没有正确处理它——它是一个子文档,每个字段都是字符串数组。这些字符串是我想要针对可接受的值进行测试的。谢谢。
-
我假设您重新指向
MainSchema以引用模型而不是架构?除此之外,一切看起来都很好,不幸的是我无法用该文档重现问题。除非我设置req.query.user = "firstname@gmail.com",否则它会从结果中省略。 -
@JohnnyHK 是的,好问题——澄清了模型/模式的事情。
标签: node.js mongodb express mongoose