【问题标题】:Find object id in object ids array returns empty array using Mongoose在对象 ids 数组中查找对象 id 使用 Mongoose 返回空数组
【发布时间】:2016-07-28 15:52:19
【问题描述】:

我有两个 Mongoose 架构:

var EmployeeSchema = new Schema({
    name: String,
    servicesProvided: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Service'
    }]
});

var ServiceSchema = new Schema({
    name: String
});

我正在尝试使用我发送到 http 请求中的服务 ID 来查找提供指定服务的员工。这是我的代码:

Employee
  .find({
    servicesProvided: req.params.service_id
  })
  .exec(function(err, employees) {
    if (err) {
      console.log(err);
      res.send(err);
    } else {
      res.json(employees);
    }
});

问题是这段代码返回一个空数组,我不知道为什么。我已经尝试了很多方法,例如将服务 ID 转换为 mongoose.Schema.Types.ObjectId 但它不起作用。

有什么想法吗?我正在使用猫鼬 3.8.39。谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose schema tingodb


    【解决方案1】:

    在您的EmployeeSchema 中,servicesProvided 是一个数组,要按该字段过滤员工,您应该使用$in 运算符:

    var services = [req.params.service_id];
    Employee.find({
      servicesProvided: {
        $in: services
      }
    }, ...
    

    【讨论】:

    • 这会搜索 inside provided array 的文档,这是不好的开销。
    • @AndreyPopov 使用索引或小列表可以相当高效。
    • 我同意,但仍然不需要。今天它是一个小清单,明天它是一个巨大的瓶颈:) 如果你能从一开始就让它变得更容易 - 为什么不呢?
    • 感谢您的回答,它可以正常工作,但如果效率更高,我会选择其他答案。
    • Np,我同意@AndreyPopov 建议的解决方案在具体情况下更可取。
    【解决方案2】:

    我认为你需要$elemMatch!来自文档:

    { _id: 1, results: [ { product: "abc", score: 10 }, { product: "xyz", score: 5 } ] },
    { _id: 2, results: [ { product: "abc", score: 8 }, { product: "xyz", score: 7 } ] },
    { _id: 3, results: [ { product: "abc", score: 7 }, { product: "xyz", score: 8 } ] }
    

    搜索喜欢:

    db.survey.find({ results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } })
    

    结果:

    { "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
    

    但是由于您正在执行单个查询条件(再次查看文档),您可以替换

    db.survey.find(
       { results: { $elemMatch: { product: "xyz" } } }
    )
    

    db.survey.find(
       { "results.product": "xyz" }
    )
    

    所以在你的情况下应该是这样的:

    find({
        'servicesProvided': ObjectId(req.params.service_id)
    })
    

    【讨论】:

    • 对不起,这两个答案都不起作用。您的第一个返回一个空数组,第二个返回一个引用错误:未定义 ObjectId。如果我使用 mongoose.Schema.Types.Object(req.params.service_id) 也不起作用。
    • 我不知道我的“第一个”和“第二个”是什么,以及为什么它不起作用,因为这应该是正确的方法(甚至在本地测试过)。不知道你的地方发生了什么。如果它适合您的需要,您可以接受其他答案,但请记住测试它发生了什么以及为什么它不起作用。再次,检查在线手册以确保;)
    • 您的第一个答案是:'servicesProvided': req.params.service_id,您的第二个答案是:'servicesProvided._id': ObjectId(req.params.service_id)。我确信这是正确的方法,但由于某种原因它不起作用。我在很多互联网论坛上都看到过这个问题,可能是 Mongoose 版本的错误。
    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2017-07-22
    • 2020-09-15
    • 2020-01-23
    • 2017-10-26
    • 2019-06-14
    • 2017-02-02
    • 2022-01-18
    相关资源
    最近更新 更多