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" ] } 

编辑 :更正模型/架构混乱,这是不是在我的代码,但被遗漏在复制/粘贴。 谢谢。

       

网上收集的解决方案 "ExpressJS和MongooseJS:我可以查询子文档中的数组值吗?"

我查找过,没有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。