【问题标题】:ExpressJS and MongooseJS: can I query array values in a subdocument?ExpressJS 和 MongooseJS:我可以在子文档中查询数组值吗?
【发布时间】:2013-02-27 05:19:24
【问题描述】:

我有一个使用 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 子句没有针对传递给 in 子句的数组的每个值来测试 permissions.read 的每个元素的值。

谢谢。

编辑:这是一个不应返回的文档,但它是(注意,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"
    ]
}

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

【问题讨论】:

  • 您是指空数组 (permissions: []) 还是包含空字符串的数组 (permissions: [''])?您能否编辑您的问题以包含一个不应该返回的示例文档?
  • @JohnnyHK 完成——注意权限子文档架构,我认为我没有正确处理它——它是一个子文档,每个字段都是字符串数组。这些字符串是我想要针对可接受的值进行测试的。谢谢。
  • 我假设您重新指向 MainSchema 以引用模型而不是架构?除此之外,一切看起来都很好,不幸的是我无法用该文档重现问题。除非我设置req.query.user = "firstname@gmail.com",否则它会从结果中省略。
  • @JohnnyHK 是的,好问题——澄清了模型/模式的事情。

标签: node.js mongodb express mongoose


【解决方案1】:

我已查找但未找到一个 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');
}

感谢您的意见,@JohnnyHK。

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2019-08-01
    • 2020-06-30
    相关资源
    最近更新 更多