ExpressJS和MongooseJS:我可以查询子文档中的数组值吗?
我有一个使用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
子句不是testingpermissions.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" ] }
编辑 :更正模型/架构混乱,这是不是在我的代码,但被遗漏在复制/粘贴。 谢谢。
我查找过,没有find一个mongodb / mongoose查询的例子,用于testing子文档数组字段或空数组字段中的指定值。
相反,因为我控制了API(来自这个代码)和客户端应用程序,我重构了它。
我现在基于客户端用户select添加三个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'); }
感谢您的意见,@JohnnyHK。