我有一个使用 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
子句没有permissions.read
针对传递给该in
子句的数组的每个值测试每个元素的值。
谢谢。
编辑:这是一个不应返回的文档,但它是(注意,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"
]
}
已编辑:更正了模型/架构混淆,这不在我的代码中,但在复制/粘贴中被遗漏了。谢谢。