ExpressJS和MongooseJS:我可以在子文档中查询数组值吗?

时间:2013-02-22 21:00:01

标签: node.js mongodb express mongoose

我有一个使用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"
    ]
}

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

1 个答案:

答案 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。