我正在尝试使用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能够返回我正在寻找的信息。
答案 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);
}});