猫鼬,按数组中的元素查找

时间:2020-03-27 22:20:59

标签: arrays node.js mongodb mongoose

我正在尝试使用Mongoose和Node.js在数组字段中查找具有特定值的所有文档。我可以在MongoDB中做到这一点,但是在Mongoose中遇到了困难。我使用Find document with array that contains a specific value作为执行此操作的指南,但是没有得到预期的结果。 我的模特:

const mongoose = require("mongoose");

const Schema = mongoose.Schema;
const ApptSchema = new Schema({
  store: { type: String, required: true },
  dotw: { type: String, required: true },
  month: { type: Number, required: true },
  day: { type: Number, required: true },
  hr: { type: Number, required: true },
  min: { type: Number, required: true },
  customers: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
  full: { type: Boolean, required: true, default: false }
});

const Appt = mongoose.model("Appt", ApptSchema);

module.exports = Appt;

我想查找包含特定客户ID的所有文档。在MongoDB Shell中,这就是我要做的:

db.appts.find({customers: "5e7e3bc4ac4f196474d8bf69"})

这可以按预期工作,为我提供了所有文档(在这种情况下为一个文档),其中此ID位于customers数组中。

{ "_id" : ObjectId("5e7e719c806ef76b35b4fd69"), "customers" : [ "5e7e3bc4ac4f196474d8bf69" ], "full" : false, "store" : "Nashville", "dotw" : "Friday", "month" : 4, "day" : 15, "hr" : 13, "min" : 0 }

在猫鼬中,这是我要尝试的:

Appt.find({ customers: "5e7e3bc4ac4f196474d8bf69" }, (err, docs) => {
    if (err) {
      console.log(err);
    } else {
      console.log(docs);
    }
  });

这将打印一个空数组,即使很显然在customers数组中有此ID的文档也是如此。 这似乎应该可行,但是我显然缺少一些难题。任何对我做错事情的见解都将不胜感激。

编辑:万一有人愿意/愿意更深入地研究一下,可以找到here到目前为止该应用程序的GitHub存储库。有问题的查询位于第111行的route / routes.js中(截至撰写本文时)。

另一个编辑:看来这与所讨论字段的Schema类型有关。我删除了ref字段中条目的customers属性,以防万一这引起了问题,但是我的查询仍然返回了一个空数组。下一个测试是向模型添加一个新字段myStrings: [String]。然后,我向一个Appt文档"working"的数组中添加了一个字符串,并查询Appt.find({myStrings: "working"}),这最终返回了我更新的Appt文档。这告诉我使用mongoose.Schema.Types.ObjectId时有些奇怪,但是我不知道该如何解决。

最终编辑:经过三重苦难,这解决了。问题如下... 为了进行测试,我使用MongoDB Shell将项目添加到数据库中,该Shell不像Mongoose那样强制执行数据类型。我没有意识到我只是将用户ID作为字符串添加到customers数组中。当Mongoose寻找ObjectIds时,它当然没有找到任何对象,并返回了一个空数组。使用customers将客户添加到db.appts.updateOne({<whatever information>},{$push:{customers: new ObjectId(<id string>)}})数组中,Mongoose能够返回我正在寻找的信息。

2 个答案:

答案 0 :(得分:0)

我要说的是,您的问题是您在过滤器中使用字符串,该字段的类型为ObjectId。因此,您需要先将字符串转换为ObjectId才能使猫鼬能够正确查询它。

Appt.find({ customers: mongoose.Types.ObjectId("5e7e3bc4ac4f196474d8bf69") }, (err, docs) => {});

答案 1 :(得分:0)

添加_id字段:

Appt.find({ customers._id: "5e7e3bc4ac4f196474d8bf69" }, (err, docs) => {
if (err) {
  console.log(err);
} else {
  console.log(docs);
}});