1

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

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

4

1 回答 1

3

我已经寻找但没有找到一个 mongodb/mongoose 查询的示例,该查询测试子文档数组字段中的指定值或空数组字段。

相反,由于我同时控制 API(此代码来自该 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');
}

感谢您的意见,@JohnnyHK。

于 2013-02-26T21:19:24.230 回答