我有一个使用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
的每个元素的值。< / p>
感谢。
编辑:这是一个不应该返回的文档,但是(注意,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"
]
}
已编辑:更正了模型/架构混淆,这不在我的代码中,但在复制/粘贴中被遗漏了。感谢。
答案 0 :(得分:3)
我找过并没找到mongodb / mongoose查询的示例,该查询测试子文档数组字段或空数组字段中的指定值。
相反,由于我控制了API(这段代码来自)和客户端应用程序,我重构了。
我现在根据客户端用户选择,在查询中添加三个where
子句中的一个:
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');
}
感谢您的投入,@ JohnhnHK。