Я пытаюсь найти все документы с определенным значением в поле массива, используя Mon goose и Node.js. Я могу сделать это в MongoDB без проблем, но у меня возникают трудности в понедельник goose. Я использовал Найти документ с массивом, который содержит спецификацию c значение в качестве руководства, как это сделать, но я не получаю ожидаемых результатов. Моя модель:
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;
Я хочу найти все документы, которые содержат определенный идентификатор клиента. В оболочке MongoDB это то, что я бы сделал:
db.appts.find({customers: "5e7e3bc4ac4f196474d8bf69"})
Это работает, как и ожидалось, предоставляя мне все документы (в данном случае один документ), где этот идентификатор находится в массиве customers
.
{ "_id" : ObjectId("5e7e719c806ef76b35b4fd69"), "customers" : [ "5e7e3bc4ac4f196474d8bf69" ], "full" : false, "store" : "Nashville", "dotw" : "Friday", "month" : 4, "day" : 15, "hr" : 13, "min" : 0 }
В понедельник goose это то, что я пытаюсь:
Appt.find({ customers: "5e7e3bc4ac4f196474d8bf69" }, (err, docs) => {
if (err) {
console.log(err);
} else {
console.log(docs);
}
});
Это печатает пустой массив, даже если есть документ, где этот идентификатор находится в customers
массив. Кажется, это должно сработать, но мне явно не хватает какой-то части головоломки. Любое понимание того, что я делаю неправильно, будет очень цениться.
Редактировать: Если кто-то захочет / захочет взглянуть более подробно, репозиторий приложения GitHub пока может можно найти здесь . Запрос находится в маршрутах / маршрутах. js в строке 111 (на момент написания).
Другое редактирование: похоже, это как-то связано с типом схемы рассматриваемого поля. , Я удалил атрибут ref
записей в поле customers
, на всякий случай, если это вызывало проблему, но мой запрос все еще возвращал пустой массив. Следующим тестом было добавление нового поля в мою модель, myStrings: [String]
. Затем я добавил строку в массив одного из моих документов Appt, "working"
, и запросил Appt.find({myStrings: "working"})
, и это, наконец, возвращает документ Appt, который я обновил. Это говорит мне, что есть что-то странное в работе с mongoose.Schema.Types.ObjectId
, но я не могу понять, как ее решить.
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: После долгих бед, эта проблема решена. Проблема заключалась в следующем ... Для тестирования я добавлял элементы в свою базу данных, используя оболочку MongoDB, которая не поддерживает типы данных, как Mon goose. Я не осознавал, что просто добавляю идентификаторы пользователей в виде строк в массив customers
. Когда Mon goose отправился на поиск ObjectIds, он, конечно, не нашел и возвратил пустой массив. При добавлении клиентов в массив customers
с помощью db.appts.updateOne({<whatever information>},{$push:{customers: new ObjectId(<id string>)}})
Mon goose смог вернуть информацию, которую я искал.